#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
функции работают внутри определенной пользователем функции, а с тем, как они работают.