R определяемые пользователем функции сохранения загрузки | Передача имен переменных в качестве аргументов с использованием deparse(замена)

#r #function #save #load

Вопрос:

Я пытаюсь написать функцию, которая принимает имя папки и имя переменной в качестве аргументов, передаваемых в базовые функции сохранения/загрузки R. Я использовал deparse(substitute(variable name)) для передачи имени переменной в качестве имени аргумента, основываясь на комментариях к другим публикациям.

Пробная версия: имя папки в моем рабочем каталоге-SData, а переменные-x и y; Я хочу создать файл .RData для каждого x и y.

 x <- 1:100
y <- "string"

getSave <- function(folder, rdata){
    save(rdata, file = paste0("./", deparse(substitute(folder)), "/", 
                              deparse(substitute(rdata)), ".RData"))
}

getSave(SData, x)
getSave(SData, y)
 

Эти файлы сохраняются как x.RData и y.RData, как я и хотел. Теперь давайте очистим среду и загрузим данные с помощью аналогичной функции:

 rm(x, y)

getLoad <- function(folder, rdata){
    load(paste0("./", deparse(substitute(folder)), "/",
                deparse(substitute(rdata)), ".RData"))
}

getLoad(SData, x) # does not work
getLoad(SData, y) # does not work

load("./SData/x.RData") # loads x but with variable name rdata
load("./SData/y.RData") # loads y but with variable name rdata
 

Данные getLoad() x.RData должны были загружаться как x в среде, то же самое для y. Пока функция не работает, функция базовой загрузки загружает обе переменные среды с именем rdata с соответствующими значениями x и y.

Я пытаюсь понять, как здесь работает deparse(замена ()). Кроме того, что вызывает эту проблему с загрузкой при замене имени реальной переменной именем переменной аргумента внутри моей функции?

Комментарии:

1. Имя папки может быть передано как «SData» или SData. Основная проблема, однако, связана с загрузкой RData из папки каталога. Даже с «SData» функция базовой загрузки возвращает имя переменной «rdata» в среде.

Ответ №1:

Вам нужно внести изменения как save в функции, так и load в функции. Используйте list аргумент в save функции для сохранения данных с теми же именами переменных, что и переданное значение.

 getSave <- function(folder, rdata){
  val <- deparse(substitute(rdata))

  save(list = val, 
       file = paste0("./", deparse(substitute(folder)), "/", val, ".RData"))
}

getSave(SData, x)
getSave(SData, y)
 

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

 getLoad <- function(folder, rdata){
  load(paste0("./", deparse(substitute(folder)), "/", deparse(substitute(rdata)), ".RData"), 
       envir = .GlobalEnv)
}

getLoad(SData, x)
getLoad(SData, y)
 

Таким образом , проблема была связана не deparse substitue с тем, как save и load функции работают внутри определенной пользователем функции, а с тем, как они работают.