R 为什么exists()函数可以工作,但不能应用于布尔语句?
我有一个快速函数,它只返回一个字符串变量,指示输入的树是否存在R 为什么exists()函数可以工作,但不能应用于布尔语句?,r,debugging,exists,R,Debugging,Exists,我有一个快速函数,它只返回一个字符串变量,指示输入的树是否存在 buildSpreadTotalDF = function(tree){ if (exists(as.character(substitute(tree)))){ ret = "The tree exists" } else{ ret = "There tree does not exist" } ret } 看来即使我这样做了 remove(tree) 并通过执行以下操作检查对象树是否不存在
buildSpreadTotalDF = function(tree){
if (exists(as.character(substitute(tree)))){
ret = "The tree exists"
}
else{
ret = "There tree does not exist"
}
ret
}
看来即使我这样做了
remove(tree)
并通过执行以下操作检查对象树是否不存在
tree
Error: object 'tree' not found
甚至可以将布尔语句与函数分开检查
> exists(as.character(substitute(tree)))
[1] FALSE
如果我按如下方式运行函数
ret = buildSpreadTotalDF(tree)
我会得到
ret
[1] "The tree exists"
这似乎违反直觉。当树显然不存在时,为什么它仍然会进入函数的第一个循环?这是因为您将函数参数命名为
树
,所以树将始终存在于函数的范围内。相反,选择一个不太可能用作变量名的参数名,例如:
buildSpreadTotalDF = function(.argh){
if (exists(as.character(substitute(.argh)))){
ret = "The tree exists"
} else{
ret = "The tree does not exist"
}
ret
}
tree <- 1
buildSpreadTotalDF(tree)
# [1] "The tree exists"
remove(tree)
buildSpreadTotalDF(tree)
# "The tree does not exist"
buildSpreadTotalDF=函数(.argh){
如果(存在(as.character(替换(.argh))){
ret=“树存在”
}否则{
ret=“树不存在”
}
ret
}
树问题是exists
将首先查看本地范围(当您仅调用exists(…)时,这是全局环境)
在函数外部,但从那里调用时在函数内部。由于树
是传递给函数的参数的名称,因此它始终存在于函数内部。您可能要做的是在全局环境中查找变量。例如,您可以通过指定where
parameter,在您的一个稍加修改的示例中,如下所示:
buildSpreadTotalDF = function(treename){
if (exists(treename, where = globalenv())){
ret = "The tree exists"
}
else{
ret = "There tree does not exist"
}
ret
}
tree1 <- 1
buildSpreadTotalDF("tree1") # exists
buildSpreadTotalDF("tree2") # does not exist
buildSpreadTotalDF=函数(treename){
if(存在(treename,其中=globalenv()){
ret=“树存在”
}
否则{
ret=“树不存在”
}
ret
}
tree1准确地说明在何处查找变量-您希望查找父帧,即调用函数的环境:
tree_exist <- function(var) {
var_name <- as.character(substitute(var))
if (exists(var_name, envir = parent.frame())){
"The tree exists"
} else {
"The tree does not exist"
}
}
tree_exist(tree_exist)
tree_exist(var_name)
tree\u exist哇,我失去了希望。我也无法通过搜索此特定案例找到结果!或者使用where
参数exists
跳过函数环境。感谢您澄清了如何使用parent.frame()