【问题标题】:Argument checking in RR中的参数检查
【发布时间】:2017-01-17 02:53:10
【问题描述】:

在 R 中,我写了一个类似的函数:

fun <- function(A, B, C, D) {}

所以,在这个函数的开头,我必须做参数检查:

  • 是否缺少一些必需的参数
  • 是否所有参数都遵循规则:class(data type)A 必须在 [1:3] 范围内

但是关于这些参数,有些是必须的,有些不是,而且每个参数的class(data type)必须是我想要的,例如:numeric逻辑,等等...

为了做到这一点,我做了这样的事情:

if(A Follow_the_rule){}
if(B Follow_the_rule){}
if(C Follow_the_rule){}
...

关于上面的代码,需要很多 if 语句,我认为这不是检查参数的最佳方式。

那么有没有更好的方法来检查 R 中的参数?

任何帮助将不胜感激。

【问题讨论】:

  • if (missing(A)) stop ("A is missing")
  • 浏览一些包的源代码(在 Github 上最简单),看看有经验的包作者是如何做到这一点的。
  • If 条件当然可以做到这一点,但问题是如果我有很多参数,我必须写很多 If() stop() 语句,我认为这不是进行参数检查的最佳方式。感谢您的帮助。
  • 同时检查来自 CRAN 的 checkmate 包。

标签: r parameter-passing


【解决方案1】:

看看?stopifnot,这正是你想要的。它检查其中的条件,如果没有给出条件,则停止。与if 相同,您可以将条件与&amp;&amp;||&amp;| 连接起来。查看信息,例如?"&amp;"allany 也可能有助于检查给定向量的所有元素是否分别满足条件或任何条件。一些例子:

foo <- function(A, B, C){
  stopifnot(!missing(C), !missing(B), !missing(A)) ##A, B, C not missing, then continue
  stopifnot(class(B)=="matrix") ## B is a matrix, then continue
  stopifnot(class(B)==class(C), all(B > C)) ## class B is class C and all elements of B are greater than C
  stopifnot((length(A)>1 && !any(is.na(A))) || all(A==0)) ## (A has more than 1 element and no element is NA) or all elements of A are 0.
  stopifnot(all(A > 2), all(A < 10)) ## all elements of A are between 2 and 10, else stop.

  #... further code
}

上述条件可能不适合这种组合,但我认为有足够的例子让你适应你的问题。当然你可以写一个stopifnot,但是如果有很多条件,将条件分组更有用,因为停止函数的条件被打印为错误代码。所以stopifnot越多,得到的错误信息就越准确。

【讨论】:

  • 但是,我是否必须使用大量 if(condition) stop("Error Message")stopifnot 来检查所有这些参数(我认为前者更好,因为你可以写出它出错的原因),或者我可以把它留给 R。
  • 如果在函数中的某个点缺少所需的变量,R 本身可能会抛出错误,但在函数调用开始时检查并可能转换变量是一个好习惯。否则,您会做一些(然后是无用的)计算,只是为了看到其他东西稍后会破坏代码。您当然可以对变量进行分组并检查每个组,例如:L &lt;- list(A, B, C)all(sapply(L, class) == "matrix")any(is.na(unlist(L)))
  • stopifnot 接受... 参数,因此可以同时通过所有检查 -- stopifnot(!missing(A), class(B) == "matrix", ..)
  • 感谢您的帮助。所以我认为在调用函数时报告哪个参数是错误的更好,而不是报告所有参数中存在问题。为了实现这个特定目的,这意味着我必须为每个参数编写 if() stop(),你不这么认为吗?
  • 我认为这取决于 1:你有什么样的参数以及你想要应用什么样的检查(L &lt;- list(A, B, C, D, ...))会抛出一个错误,比如:Object D is missing。如果您想一次检查同一类的更多对象,我在之前的评论中给出了另一个示例。 if .. stop .. 的优点是您可以编写自己的错误消息,而 stopifnot 提供默认错误消息。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2023-03-09
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2011-03-15
  • 2016-04-02
相关资源
最近更新 更多