r - 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
未定义时不崩溃的功能?
解决方案
可以在函数内部检查全局环境中是否存在对象,但我们感兴趣的不是 的值x
,而是调用函数时传递给的对象x
。在这里,我们可以使用enquo
fromrlang
将传入的表达式转换为 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
不存在。
推荐阅读
- r - R:将数据框列中的空字符串替换为“0”会导致所有列值都替换为“0”
- java - 我想在午夜值中添加小时数以根据我的时区显示目的地时间
- java - 使用 gluon Charm 模块化项目时出错:可从多个模块访问包 com.gluonhq.charm.down.plugins
- excel - Excel VBA:无法在函数(不是子函数)内设置范围值?
- python - 在动态表单django中添加多个项目
- reactjs - React:改变嵌套状态一次
- regex - 修改正则表达式以匹配开始和结束字符
- docker - docker:来自守护进程的错误响应:安装源“/”上的错误设置标签:不允许 SELinux 重新标记 /
- mysql - 如何在mysql中选择三个带有join的表?
- python - 在异步生成器函数中从托儿所内部屈服是不是很糟糕?