【问题标题】:Check if set of variables are defined & not NULL inside execution environment检查是否定义了一组变量并且在执行环境中不是 NULL
【发布时间】: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 检查所有内容是否按预期导入。如果您的方法允许作为列表导入,那将更容易。

标签: r scope


【解决方案1】:

我会使用这种方法:

myenv <- new.env()
source(textConnection("a <- 1"), local = myenv)
c("a", "b") %in% ls(myenv)
#[1]  TRUE FALSE

这假设源脚本没有明确分配到环境中。

然后您可以将这些变量用作myenv$a,从而避免任何范围界定。

【讨论】:

  • 谢谢!使用带有明确定义的环境的类似列表的查找比试图将get 限制在执行环境中要干净得多。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2012-01-20
  • 2021-04-21
  • 2015-05-01
  • 1970-01-01
  • 2015-07-14
  • 2015-06-23
  • 2013-08-03
相关资源
最近更新 更多