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

时间:2019-07-17 18:06:24

标签: r function missing-data 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时函数不会崩溃的问题?

2 个答案:

答案 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