R - 检查函数中是否存在对象
R - checking for existence of objects in a function
假设我有一组变量 x, y
可能已定义也可能未定义。这些变量被传递到一个名为 test
的函数中。
y <- 10
test <- function(a,b) { ifelse(a > b, "hello", "world") }
test(x,y)
# Error in ifelse(a > b, "hello", "world") : object 'x' not found
如果我在 x 尚未实例化时调用 test(x,y)
,R 将抛出 "object 'x' not found" 错误。
如果我添加一个存在检查,该函数在从全局环境调用它时会起作用
y <- 10
test <- function(a,b) {
print(exists(as.character(substitute(a))))
if (!exists(as.character(substitute(a)))) {a <- 0}
ifelse(a > b, "hello", "world")
}
test(x,y)
# [1] FALSE
# [1] "world"
x <- 11
test(x,y)
[1] TRUE
[1] "hello"
但是,如果我将 test(x,y)
包装在 blah
函数中。找不到现有变量。
rm(list=ls())
test <- function(a,b) {
print(exists(as.character(substitute(a))))
if (!exists(as.character(substitute(a)))) {a <- 0}
ifelse(a > b, "hello", "world")
}
blah <- function() { x <- 11; y <- 10; test(x,y)}
blah()
[1] FALSE -- expecting TRUE
[1] "world" -- expecting "hello"
我猜失败是因为它没有在正确的环境中寻找。知道我怎样才能让它正常工作吗?
您可以指定您首先查看的环境:
test <- function(a,b) {
print(exists(as.character(substitute(a)), envir=parent.frame()))
if (!exists(as.character(substitute(a)), envir=parent.frame())) {a <- 0}
ifelse(a > b, "hello", "world")
}
这样:
y <- 10
test(x,y)
# [1] FALSE
# [1] "world"
x <- 11
test(x,y)
#[1] TRUE
#[1] "hello"
rm(list=ls())
test <- function(a,b) {
print(exists(as.character(substitute(a)), envir=parent.frame()))
if (!exists(as.character(substitute(a)), envir=parent.frame())) {a <- 0}
ifelse(a > b, "hello", "world")
}
blah <- function() { x <- 11; y <- 10; test(x,y)}
blah()
#[1] TRUE
#[1] "hello"
假设我有一组变量 x, y
可能已定义也可能未定义。这些变量被传递到一个名为 test
的函数中。
y <- 10
test <- function(a,b) { ifelse(a > b, "hello", "world") }
test(x,y)
# Error in ifelse(a > b, "hello", "world") : object 'x' not found
如果我在 x 尚未实例化时调用 test(x,y)
,R 将抛出 "object 'x' not found" 错误。
如果我添加一个存在检查,该函数在从全局环境调用它时会起作用
y <- 10
test <- function(a,b) {
print(exists(as.character(substitute(a))))
if (!exists(as.character(substitute(a)))) {a <- 0}
ifelse(a > b, "hello", "world")
}
test(x,y)
# [1] FALSE
# [1] "world"
x <- 11
test(x,y)
[1] TRUE
[1] "hello"
但是,如果我将 test(x,y)
包装在 blah
函数中。找不到现有变量。
rm(list=ls())
test <- function(a,b) {
print(exists(as.character(substitute(a))))
if (!exists(as.character(substitute(a)))) {a <- 0}
ifelse(a > b, "hello", "world")
}
blah <- function() { x <- 11; y <- 10; test(x,y)}
blah()
[1] FALSE -- expecting TRUE
[1] "world" -- expecting "hello"
我猜失败是因为它没有在正确的环境中寻找。知道我怎样才能让它正常工作吗?
您可以指定您首先查看的环境:
test <- function(a,b) {
print(exists(as.character(substitute(a)), envir=parent.frame()))
if (!exists(as.character(substitute(a)), envir=parent.frame())) {a <- 0}
ifelse(a > b, "hello", "world")
}
这样:
y <- 10
test(x,y)
# [1] FALSE
# [1] "world"
x <- 11
test(x,y)
#[1] TRUE
#[1] "hello"
rm(list=ls())
test <- function(a,b) {
print(exists(as.character(substitute(a)), envir=parent.frame()))
if (!exists(as.character(substitute(a)), envir=parent.frame())) {a <- 0}
ifelse(a > b, "hello", "world")
}
blah <- function() { x <- 11; y <- 10; test(x,y)}
blah()
#[1] TRUE
#[1] "hello"