我有四个功能:
f1 <- function(x){if(exists(x)){return(2*x)}}
f2 <- function(x){if(exists("x")){return(2*x)}}
f3 <- function(x){if(!missing(x)){return(2*x)}}
f4 <- function(x){if(!missing("x")){return(2*x)}}
但是,exists
和missing
在以上任何格式下均无法正常工作,并且我收到以下错误消息:
f1(x)
Error in exists(x) : object 'x' not found
f2(x)
Error in f2(x) : object 'x' not found
f3(x)
Error in f3(x) : object 'x' not found
f4(x)
Error in f4(x) : object 'x' not found
有没有办法修复未定义x
时函数不会崩溃的问题?
答案 0 :(得分:2)
可以检查函数内部的全局环境中是否存在对象,但我们感兴趣的不是x
的值,而是当对象传递给x
时的对象。函数被调用。在这里,我们可以使用enquo
中的rlang
将传递给表达式的表达式转换为quosure,然后quo_name
将其转换为字符串:
library(rlang)
f1 <- function(x){
arg <- quo_name(enquo(x))
if(exists(arg, where = .GlobalEnv)){
return(2*x)
} else {
cat('variable ', '`', arg, '`', ' does not exist', sep = "")
}
}
输出:
> x <- 2
> f1(x)
[1] 4
> f1(y)
variable `y` does not exist
假设y
不存在。
答案 1 :(得分:1)
R解释器首先计算行f(x)
,然后计算函数中的内容。解释器发现未知元素x
,并立即停止评估其余代码。
因此,它不能在您给出的任何情况下使用,因为问题出在功能评估之前。
您必须将支票置于该功能之外:
if(exists("x")) {
f(x)
}
或者,根据您的需要,您可以执行以下操作:
f <- function(x) {
if(!missing("x")) { return(x * 2) }
}
f() // do nothing
f(2) // return 4