我想检查是否在R中定义了一些变量 - 没有出错 . 我怎样才能做到这一点?
我的尝试(不成功):
> is.na(ooxx) Error: object 'ooxx' not found > is.finite(ooxx) Error: object 'ooxx' not found
谢谢!
你想 exists() :
exists()
R> exists("somethingUnknown") [1] FALSE R> somethingUnknown <- 42 R> exists("somethingUnknown") [1] TRUE R>
有关"...is defined"的某些定义,请参阅 ?exists . 例如 .
?exists
> exists("foo") [1] FALSE > foo <- 1:10 > exists("foo") [1] TRUE
如果你在函数内部,则缺少()就是你想要的 .
exchequer = function(x) { if(missing(x)){ message("x is missing… :-(") } } exchequer() x is missing… :-(
正如其他人所指出的那样,你正在寻找 exists . 请记住,无论是否定义了变量,使用带有R基本包使用的名称的 exists 都将返回true:
exists
> exists("data") [1] TRUE
要解决这个问题(正如Bazz所指出的那样;请参阅 ?exists ),请使用 inherits 参数:
inherits
> exists("data", inherits = FALSE) [1] FALSE foo <- TRUE > exists("foo", inherits = FALSE) [1] TRUE
当然,如果你想搜索附加包的名称空间,这也可能不足:
> exists("data.table") [1] FALSE require(data.table) > exists("data.table", inherits = FALSE) [1] FALSE > exists("data.table") [1] TRUE
我唯一能想到的解决方法是 - 在附加包中搜索而不是在基础包中搜索 - 如下:
any(sapply(1:(which(search() == "tools:rstudio") - 1L), function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
将 _object_name_ 与 "data.table" ( TRUE )与 "var" ( FALSE )进行比较
_object_name_
"data.table"
TRUE
"var"
FALSE
(当然,如果你不在RStudio上,我认为第一个自动附加的环境是 "package:stats" )
"package:stats"
如果您不想使用引号,可以使用我在“替换”的示例部分中找到的deparse(substitute())技巧:
is.defined <- function(sym) { sym <- deparse(substitute(sym)) env <- parent.frame() exists(sym, env) } is.defined(a) # FALSE a <- 10 is.defined(a) # TRUE
5 回答
你想
exists()
:有关"...is defined"的某些定义,请参阅
?exists
. 例如 .如果你在函数内部,则缺少()就是你想要的 .
正如其他人所指出的那样,你正在寻找
exists
. 请记住,无论是否定义了变量,使用带有R基本包使用的名称的exists
都将返回true:要解决这个问题(正如Bazz所指出的那样;请参阅
?exists
),请使用inherits
参数:当然,如果你想搜索附加包的名称空间,这也可能不足:
我唯一能想到的解决方法是 - 在附加包中搜索而不是在基础包中搜索 - 如下:
将
_object_name_
与"data.table"
(TRUE
)与"var"
(FALSE
)进行比较(当然,如果你不在RStudio上,我认为第一个自动附加的环境是
"package:stats"
)如果您不想使用引号,可以使用我在“替换”的示例部分中找到的deparse(substitute())技巧: