我正在寻找一种通用的做法,如何检查函数中定义的参数。 我提出了这三个想法。哪一个是正确的做法?
不幸的是,第三个没有用。 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)))
}
答案 0 :(得分:3)
从经验丰富的编码员那里查看代码通常是个好主意 - 而R本身在R资源中有很多例子。
我已经看到你的第一个和第二个例子都被使用了。第一个是非常惯用的;我个人仍然习惯性地使用第二种。第三个我觉得太模糊了。
答案 1 :(得分:2)
我个人认为使用默认值的第二种方法更容易使用&amp;了解。 (而第三种方法真的很糟糕)
...尤其是在编写需要向其传递参数的包装函数时。如何传递“缺失”值并不明显!
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
[已授予,还有其他方法可以解决传递缺失值的问题,但重点是使用默认值会更容易......]
要考虑的一些默认值为NULL
,NA
,numeric(0)
,''