首页 > 解决方案 > R - 内部函数检查对象是否存在

问题描述

我有四个功能:

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未定义时不崩溃的功能?

标签: rfunctionmissing-dataexists

解决方案


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


推荐阅读