R - 内部函数检查对象是否存在

R - Inside function check if object exists

我有四个功能:

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)}}

但是,existsmissing 对于上述任何格式都无法正常工作,我收到以下错误消息:

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 未定义时函数不崩溃的问题吗?

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

可以在函数内部检查全局环境中是否存在对象,但我们感兴趣的不是 x 的值,而是传递给 x 的对象当函数被调用时。在这里我们可以使用 rlang 中的 enquo 将传入的表达式转换为 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 不存在。