NSE переменной среды в R

Вопрос касается проверки существования среды, и если она не найдена, либо создайте среду, либо верните имя переменной, переданное по какой-либо причине. По сути, это функция, которую я использую в ряде неконтролируемых функций для определения путей назначения объектов, а также функций, которые возвращаются в ответ на наблюдаемые переменные, возвращаемые извне функций и т. Д.

Моя функция отлично работает для всех интенсивных целей, которые я тестировал, но я знаю, что забыл кое-что очень простое, что делает использование обходного пути совершенно ненужным.

Проблема заключается в том, что переменная 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 = ...)) в подобных ситуациях, но по какой-то причине я не мог заставить его вести себя с настройками среды...

0 ответов

Другие вопросы по тегам