【发布时间】:2017-08-11 08:00:53
【问题描述】:
在一个函数中,我想检查变量名称是否存在于本地范围内(不查看父环境),如果存在,则不为 NULL。下面的工作示例,但我想知道是否有比我现在使用的复杂的 sapply 调用更优雅的方法:
a = 1
f <- function () {
source(textConnection("b <- 2;c <- NULL"), local = TRUE)
vars <- c("a", "b", "c", "d")
# a, c & d are missing || NULL in local scope
# (a is missing as it was defined outside function env)
# create a logical vector where TRUE means missing/NULL
missing_vars <- sapply(vars, function(x)
is.null(get0(x, inherits = FALSE, envir = parent.env(environment()))))
print(missing_vars)
# try to auto-detect appropriate values for missing vars,
# then call the original function
# ...
}
已解决 - 根据以下 Roland 的回答重写示例:
a <- 1
g <- function () {
myenv <- new.env()
source(textConnection("b <- 2;c <- NULL"), local = myenv)
vars <- c("a", "b", "c", "d")
missing_vars <- sapply(vars, function(x) is.null(myenv[[x]]))
print(missing_vars)
}
背景: 对于需要一长串参数(水文建模)的函数,我正在编写一个包装器,它允许用户在简单的 R 脚本中将所需的参数定义为变量。然后将此“配置”脚本导入函数 env。如果某些变量丢失或设置为 NULL,我有一些代码可以在调用原始函数之前自动检测这些值。
【问题讨论】:
-
您永远不应该依赖范围界定。始终将所有变量作为函数参数传递。然后您可以根据
missing处理缺失的参数。 -
@Roland 好吧,这个特定函数的全部意义在于从作为“配置”文件的外部用户编写的 R 脚本中获取变量(编辑示例)。我明确不依赖在外部范围中定义的变量,但要确保将它们排除在查找之外。
-
如果你导入它们,你可以检查是否所有的相关变量都被导入了。例如,您可以创建一个环境,导入该环境 (
local = myenv),然后使用ls检查所有内容是否按预期导入。如果您的方法允许作为列表导入,那将更容易。