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()