【问题标题】:R user-defined save load functions | Passing variable names as arguments using deparse(substitute)R 用户自定义保存加载函数 |使用 deparse(substitute) 将变量名称作为参数传递
【发布时间】:2021-12-02 12:21:28
【问题描述】:

我正在尝试编写一个函数,它将文件夹名称和变量名称作为参数传递给 R 的基本保存/加载函数。我已经使用deparse(substitute(variable name)) 将变量名称作为参数名称传递,基于其他帖子上的 cmets。

试用:我的工作目录下的文件夹名称是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()) 是如何在这里工作的。另外,在我的函数中用实参变量名替换实际变量名导致这个加载问题的原因是什么?

【问题讨论】:

  • 文件夹名称可以作为“SData”或SData 传递。然而,主要问题是从目录文件夹加载 RData。即使使用“SData”,基本加载函数也会在环境中返回变量名称“rdata”。

标签: r function save load


【解决方案1】:

您需要在 saveload 函数中进行更改。在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)

所以问题与deparsesubstitue 无关,而是saveload 函数在用户定义函数中的工作方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2014-08-18
    • 2015-06-16
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多