R 用户定义的保存加载函数 |使用 deparse(substitute) 将变量名作为参数传递
R user-defined save load functions | Passing variable names as arguments using deparse(substitute)
我正在尝试编写一个函数,将文件夹名称和变量名称作为参数传递给 R 的 save/load 函数。根据其他帖子的评论,我使用 deparse(substitute(variable name))
将变量名作为参数名传递。
试用:我工作目录下的文件夹名为SData,变量为x和y;我想为每个 x 和 y 创建一个 .RData 文件。
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(substitute()) 在这里是如何工作的。另外,是什么导致了这个加载问题,即在我的函数中用参数变量名替换了真实变量名?
您需要在 save
和 load
函数中进行更改。在 save
函数中使用 list
参数,以与传递值相同的变量名保存数据。
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
函数如何在用户定义的函数中工作。
我正在尝试编写一个函数,将文件夹名称和变量名称作为参数传递给 R 的 save/load 函数。根据其他帖子的评论,我使用 deparse(substitute(variable name))
将变量名作为参数名传递。
试用:我工作目录下的文件夹名为SData,变量为x和y;我想为每个 x 和 y 创建一个 .RData 文件。
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(substitute()) 在这里是如何工作的。另外,是什么导致了这个加载问题,即在我的函数中用参数变量名替换了真实变量名?
您需要在 save
和 load
函数中进行更改。在 save
函数中使用 list
参数,以与传递值相同的变量名保存数据。
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
函数如何在用户定义的函数中工作。