跳到内容
/ 瓦拉丁 公共

功能输入验证,使R函数更具可读性和鲁棒性

许可证

未知,找到MIT许可证

找到的许可证

未知
许可证
麻省理工学院
许可.md
通知 您必须登录才能更改通知设置

egnha/valaddin公司

发展已转移到

瓦拉丁

R-CMD检查 CRAN_状态_标签 稳定性-冻结

处理无效的功能输入是R用户的长期痛苦,给定R的弱类型性质。瓦拉丁缓解疼痛-a轻量级R包,使您能够转换现有函数输入验证检查功能,就地在某种程度上既适合程序化使用,也适合交互式会话。

安装

从安装CRAN(起重机)

安装.包("瓦拉丁")

或使用开发工具包裹

#install.packages(“devtools”)
开发工具::安装github("egnha/valaddin公司",裁判 = "开发",构建渐晕图 = 真的)

为什么使用valaddin

故障快速,节省时间,避免混乱

当你知道的时候,你可以更加自信你的功能正常工作它的论点表现良好。但如果不是这样,最好停止立即把他们排成一行,然后让他们过去并发怒破坏,使自己暴露在破损中,或者更糟的是,默默地不正确结果。验证你的功能输入是很好的防御编程实践。

假设你有一个函数secant()

割线 <- 功能((f),x个,dx公司)(f)(x个 + dx公司)-(f)(x个))/ dx公司

并且您希望确保用户(或某些代码)提供数字输入x个dx公司通常,你会重写secant()所以它如果违反此条件,则停止:

secant_numeric(秒_数字) <- 功能((f),x个,dx公司) {stopifnot(非数字(x个),是数字(dx公司))正割((f),x个,dx公司)}割线_数字(日志,1,.1)#> [1] 0.9531018secant_numeric(秒_数字)(日志,"1",".1")#>secant_numeric(log,“1”,“.1”)中出错:是.numeric,(x)不是TRUE

R中的标准方法存在问题

虽然这很有效,但即使在这种简单的情况下也不理想,因为

  • 在控制台上进行交互使用很不方便:您必须声明一个新函数,并为其指定一个新名称(或copy-paste原始功能体)

  • 它不会捕获所有错误,只捕获发生在检查

  • 如果你后来意识到你需要额外的东西,你就回到了原点检查,或者想跳过它们。

瓦拉丁纠正了这些缺点

valaddin提供了一个函数坚定()负责输入验证人转换现有函数,而不是强制你要写一个新的。它还通过报告帮助您每一个弱点检查。

图书馆(瓦拉丁)#检查`x`和`dx`是否为数字
割线 <-牢固地(割线,列表(~x个,~dx公司)~ is.数字)正割(日志,1,.1)#> [1] 0.9531018正割(日志,"1",".1")#>错误:正割(f=log,x=“1”,dx=“.1”)
#>1)FALSE:是数字(x)
#>2)FALSE:是数字(dx)

要添加其他检查,只需再次应用相同的程序:

割线 <-牢固地(割线,列表(~x个,~dx公司)~{长度(.)== 1升})正割(日志,"1",c(.1,.01))#>错误:正割(f=log,x=“1”,dx=c(0.1,0.01))
#>1)FALSE:为数字(x)
#>2)FALSE:(函数(.){长度(.)==1L})(dx)

或者,也可以选择一次性完成:

割线 <-松散地(割线)#检索原始函数
割线 <-牢固地(割线,列表(~x个,~dx公司)~{是数字(.)&&长度(.)== 1升})正割(日志,1,.1)#> [1] 0.9531018割线(日志,"1",c(.1,.01))#>错误:正割(f=log,x=“1”,dx=c(0.1,0.01))
#>1)FALSE:(函数(.){is.nummeric(.)&&length(.)==1L})(x)
#>2)FALSE:(函数(.){is.nummeric(.)&&length(.)==1L})(dx)

使用简单、一致的语法检查任何内容

坚定()使用简单的公式语法指定任意检查-否只需进行类型检查。每一张支票都是一个公式<检查位置>~<检查内容>。右边的“what”部分是功能这会进行检查,而(形式)“where”部分位于左侧指示在何处应用检查论据表达其中。

valaddin提供了许多方便来进行检查坚定()信息丰富,易于指定。

使用自定义错误消息

使用自定义错误消息澄清目的支票金额:

公元前 <- 功能(x个,)c(c)(x个,,1 - x个 - )#检查“y”是否为正值
bc_uhp(超高压) <-牢固地(公元前,列表("(x,y)不在上半平面" ~ )~{. > 0})bc_uhp(超高压)(.5,.2)#> [1] 0.5 0.2 0.3bc_马力(.5,-.2)#>错误:bc_uhp(x=0.5,y=-0.2)
#>(x,y)不在上半平面

轻松对所有参数应用检查

将检查公式的左侧留空,以将其应用于所有论据:

bc_数字 <-牢固地(公元前,~is.数字)bc_数字(.5,".2")#>错误:bc_num(x=0.5,y=“.2”)
#>FALSE:是数字(y)bc_数量(".5",".2")#>错误:bc_num(x=“.5”,y=“.2”)
#>1)FALSE:是数字(x)
#>2)FALSE:是数字(y)

或填写自定义错误消息:

bc_数字 <-牢固地(公元前,"不是数字" ~ is.数字)bc_数字(.5,".2")#>错误:bc_num(x=0.5,y=“.2”)
#>非数字:`y`

使用多参数相关性检查条件

使用isTRUE()根据多个谓词实现检查参数或等同于支票制作人vld_true():

三角形内(_T) <- 功能(x个,) {x个 >= 0 &&  >= 0 && 1 - x个 -  >= 0}外部 <- "(x,y)不在三角形中"

bc_tri公司 <-牢固地(公元前,列表(外部 ~三角形内(_T)(x个,))~ 是真的)#或者更简洁地说:
bc_tri公司 <-牢固地(公元前,vld_true(外部 ~三角形内(_T)(x个,)))#或者更简洁地说,通过依赖自动生成的错误消息:
#bc_tri<-稳固(bc,vld_true(~in_triangle(x,y)))bc_tri公司(.5,.2)#> [1] 0.5 0.2 0.3bc_tri公司(.5,.6)#>错误:bc_tri(x=0.5,y=0.6)
#>(x,y)不在三角形中

使代码更容易理解

要使函数更容易理解,请声明输入假设并将核心逻辑向前推进。您可以使用坚定(),有几种方式:

  • 通过显式赋值,在函数头之前进行输入检查函数到坚定().f型参数:

    公元前 <-牢固地(~is.数字,~{长度(.)== 1升},vld真(外部 ~三角形内(_T)(x个,)),.f型 = 功能(x个,) {c(c)(x个,,1 - x个 - )})公元前(.5,.2)#> [1] 0.5 0.2 0.3公元前(.5,c(.2,.1))#>误差:bc(x=0.5,y=c(0.2,0.1))
    #>1)FALSE:(函数(.){长度(.)==1L})(y)
    #>2)错误评估检查(函数(x)为逻辑(x)&&长度(x)==1L&&!is.na(x)&&x)(in_triangle(x,y)):“长度=2”强制到“逻辑(1)”公元前(".5",1)#>错误:bc(x=“.5”,y=1)
    #>1)FALSE:是数字(x)
    #>2)(x,y)不在三角形中
  • 使用马格里特 %>%操作员通过将输入检查捕获为列表坚定().检查表参数:

    图书馆(马格里特)公元前2年 <- 列表(~is.数字,~{长度(.)== 1升},vld_true值(外部 ~三角形内(_T)(x个,))) %>%牢固地(功能(x个,) {c(c)(x个,,1 - x个 - )},.检查表 = .)
  • 更好的是,使用%签入%操作员:

    公元前3年 <- 列表(~is.数字,~{长度(.)== 1升},vld真(外部 ~三角形内(_T)(x个,))) %办理登机手续%功能(x个,) {c(c)(x个,,1 - x个 - )}

了解更多信息

请参阅程序包文档?坚决地,帮助(p=valaddin)对于有关的详细信息坚定()及其配套功能,以及这个小插曲以获得用例的概述。

相关程序包

  • 坚定自信的,断言、和将死提供便利可以结合使用的谓词函数集合具有坚定().

  • 阿古菲采取不同的输入验证方法,使用氧气要指定的注释检查。

  • 保证人资产占有人提供一种方式验证函数值。此外,保险公司还提供实验性替换函数()使用生成函数类型有效的参数。

  • typeCheck(类型检查),与R的类型,启用通过以下方法创建具有类型有效参数的函数特殊类型注释。此方法与valaddin:而valaddin指定输入检查为谓语具有范围的函数,typeCheck将输入检查指定为论据类型为.

许可证

麻省理工学院版权所有©2016–2023尤金·哈

关于

功能输入验证,使R功能更具可读性和健壮性

话题

资源

许可证

未知,找到MIT许可证

找到的许可证

未知
许可证
麻省理工学院
许可.md

星星

观察者

叉子

包装

未发布包