为缺少函数输入生成特定的错误代码

Generate specific error code for missing function input

提问人:Andrea 提问时间:9/26/2023 最后编辑:Konrad RudolphAndrea 更新时间:9/26/2023 访问量:47

问:

我有两个类似于以下功能的功能。第一个检测变量是否为空,而第二个变量将生成与此问题无关的内容。我希望第二个函数在其中带有“if”的条件下输出以下特定的错误消息:

is.blank <- function(x) is.na(x) | x == ""

generate_something <- function(n, m, roll) {
  if (is.blank(n)) {
     stop("Missing number of blocks.")
  }
  if (is.blank(m)) {
     stop("Missing M number.")
  }
  if (is.blank(roll) && m > 27) {
     stop("Missing roll where relevant.")
  }
}

但是,当我尝试在缺少任何输入的情况下运行 generate_something() 时,R 不能很好地处理这一点。相反,它会给我自己的错误消息:

Error in generate_something(m = 34, roll = 1) :
 argument "n" is missing with no default

但是,如果我定义所有输入都等于 NULL 的函数,那么这也不能解决问题。我能做些什么来解决这个问题?

r 函数 if-statement 错误处理

评论

0赞 Andrea 9/26/2023
@SamR,是的,我的阿波吉斯。我已经编辑了我的错别字
1赞 MrFlick 9/26/2023
请注意,R 有一个内置函数,用于检查缺少的参数。请注意,“missing”与“blank”不同。在检查它的值是否为空之前,您必须不丢失。missing
0赞 SamR 9/26/2023
如果你根本不提供,例如,你甚至不会到达函数的第一行来检查是否为空。这就是你的情况。如果需要,则需要在函数定义中提供默认参数,例如 .ngenerate_something(m = 34, roll = 1)nngenerate_something <- function(n = NA, m, roll)

答:

1赞 DaveArmstrong 9/26/2023 #1

我认为要做到这一点,你必须包括 ,但你必须首先评估它,然后如果不是,评估其他条件:is.null(x)is.blank()NULL

is.blank <- function(x) is.null(x) || is.na(x) || x == ""

generate_something <- function(n=NULL, m=NULL, roll=NULL) {
  if (is.blank(n)) {
    stop("Missing number of blocks.")
  }
  if (is.blank(m)) {
    stop("Missing M number.")
  }
  if (is.blank(roll) && m > 27) {
    stop("Missing roll where relevant.")
  }
}

generate_something()
#> Error in generate_something(): Missing number of blocks.
generate_something(n=4)
#> Error in generate_something(n = 4): Missing M number.
generate_something(n=4, m=6)

创建于 2023-09-26 使用 reprex v2.0.2

评论

0赞 Andrea 9/26/2023
我有什么方法可以修改is.blank(),以便我可以以相同的方式使用它,并具有您显示的相同结果?
0赞 DaveArmstrong 9/26/2023
@Andrea 我刚刚上传了一个修改 .is.blank()
1赞 DaveArmstrong 9/26/2023
谢谢@KonradRudolph - 我更新了答案。
1赞 Ronak Shah 9/26/2023 #2

我想@MrFlick已经回答了你的问题。你正在寻找的是功能,而不是空白。missing

generate_something <- function(n, m, roll) {
  if (missing(n) || is.blank(n)) {
    stop("Missing number of blocks.")
  }
  if (missing(m) || is.blank(m)) {
    stop("Missing M number.")
  }
  if ((missing(roll) || is.blank(roll)) && m > 27) {
    stop("Missing roll where relevant.")
  }
}

generate_something(m = 34, roll = 1) 

#Error in generate_something(m = 34, roll = 1) : Missing number of blocks.

generate_something(n = 2, roll = 1) 

#Error in generate_something(n = 2, roll = 1) : Missing M number.

generate_something(n = 2, m = 34) 

#Error in generate_something(n = 2, m = 34) : Missing roll where relevant.

generate_something(n = 2, m = 34, roll = 2)