1

问题是关于验证环境的存在,如果没有找到,要么创建环境,要么返回因任何原因传递的变量名。本质上,这是我在一系列无监督函数中使用的一个函数,用于确定对象的分配路径,以及响应从外部函数返回的观察变量而返回的函数等。

我的功能适用于我测试过的所有密集用途,但我知道我忘记了一些非常基本的东西,这使得完全不需要使用变通方法。

问题是代表环境名称的 x 变量需要被接受为带引号的字符串或不带引号的字符串。我在很多函数中都使用了这种方法,但由于某种原因,我发现将相同的系统应用到这个系统时会出现很多错误。这是我的例子......请有人告诉我我忘记或找不到的可笑的简单方法,这让我觉得它很荒谬。

  env.ensure <- function(x = NULL, create_if_not = TRUE, silent = FALSE){

  chk <- tryCatch(x, error = function(e){
    # Possibly the cheapest, ugliest work-around I've ever pulled...
    (gsub("^(.*?)object '|' not found>$","",capture.output(e)))
  })

  if(!is.environment(chk)){
    if(!create_if_not){
      return(chk)
    }else {
      assign(chk, new.env(), envir = .GlobalEnv) %>% (function(x){
        if(typeof(x) == "environment"){
          point <- as.environment(x)
          if(!silent){
            return(point)
          }
        }
      })
    }
  }else {
    point <- as.environment(chk)
    if(!silent){
      return(point)
    }
  }

}

为简洁起见,这里是我到目前为止运行的测试:

#' # From the console 
#' > exists(silly_stuff) ## Error in exists(silly_stuff): object 'silly_stuff' not found
#' 
#' # Now passed as a non quoted variable
#' > env.ensure(.silly_things)
#' <environment: 0x00000000160895e8>
#' #' > find('.silly_things')
#' [1] ".GlobalEnv"
#' > rm(.silly_things)
#' 
#' # No output
#' > env.ensure(silly_stuff, silent = TRUE)
#' > rm(silly_stuff)
#' 
#' # with output
#' > env.ensure(mte_shat, silent = FALSE)
#' <environment: 0x00000000268e5298>
#' > rm(mte_shat)
#' 
#' # Output with quoted variable
#' > env.ensure("mte_shat", silent = FALSE)
#' <environment: 0x00000000268bd7e8>
#' > rm(mte_shat)
#' 
#' # Output the variable passed, and don't create the environment
#' 
#' > env.ensure(".mte_shat", silent = FALSE, create_if_not = FALSE)
#' [1] ".mte_shit"
#' 
#' > env.ensure(.gd, silent = TRUE)
#' > find('.gd')
#' [1] ".GlobalEnv"
#' 
#' 

使用基本包数据的用例示例

 A <- list(env_name = "base_data", autos = mtcars, population = uspop, 
            expenses = USPersonalExpenditure)
 saveRDS(A,"my_data.rds")

 readRDS('my_data.rds') %>% (function(x){
    list2env(x[grep('env_name$', names(x), invert = TRUE)], 
             envir = env.ensure(x[['env_name']], silent = TRUE))
  })

 names(base_data)
[1] "autos"      "expenses"   "population"

还想指出我在类似情况下使用 deparse(substitute (...)) / eval (parse (text = ...)) 但由于某种原因我无法让它与环境设置一起运行......

4

0 回答 0