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)}}
但是,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
未定义时函数不崩溃的问题吗?
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
不存在。
我有四个功能:
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
未定义时函数不崩溃的问题吗?
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
不存在。