检查参数是否已定义

4

我正在寻找一个通用的方法来检查函数中是否定义了参数。 我想到了以下三种方法。哪一种是正确的方法?

不幸的是,第三种方法无法正常工作。在函数中,substitute()的工作方式有所不同,我无法弄清楚如何正确使用它。

file.names <- list(
                   cov.value <- "cov.rds",
                   plot.name <- "plot.pdf"
)

test1 <- function(file.names){
  is.save <- !missing(file.names)
}

test2 <- function(file.names = NULL) {
  is.save <- !is.null(file.names)
}

test3 <- function(file.names = NULL) {
  is.save <- exists(as.character(substitute(file.names)))
}

1
我在很多地方都看到了前两种的使用。我不建议你的第三次尝试。 - joran
你可能想查看这个问题的答案。我比较偏向于这个答案 - BenBarnes
@BenBarnes,感谢提供链接。链接中的答案扩展了此问题以测试参数是否在...参数中定义。 - microbe
@microbe,感谢您查看链接。match.call()将告诉您是否定义了任何参数(包括正式参数 - 在您的示例中是file.names - 以及提供给 ... 的参数)。 - BenBarnes
2个回答

3

我个人认为具备默认值的第二种方法使用起来要容易得多、更易理解。(而第三种方法真的很糟糕)

...特别是当你编写一个包装函数需要向其传递参数时。如何传递“缺失”值并不明显!

wraptest1 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else alist(a=)[[1]] # Hacky way of assigning 'missing'-value
    print(test1(file.names))
}
wraptest1(2) # TRUE
wraptest1(0) # FALSE

wraptest2 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else NULL # Much easier to read & understand
    print(test2(file.names))
}
wraptest2(2) # TRUE
wraptest2(0) # FALSE

[尽管还有其他方法可以解决传递缺失值的问题,但使用默认值要简单得多...]

考虑一些默认值,如NULLNAnumeric(0)''


我同意使用明确的默认值。 - microbe

2

一般来说,查看有经验的程序员编写的代码是一个好主意——而R本身在R源代码中有很多例子。

我见过你提供的第一个和第二个例子都被使用。第一个相当习惯用语;出于习惯,我个人更常使用第二个。我觉得第三个太晦涩难懂了。


感谢您的评论。我猜第二个更传统,因为您习惯使用它。 :) 我会尝试坚持使用第二个,看看是否适合我。 - microbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接