将列表元素保存到" .Rda"文件内部的函数

时间:2014-02-16 08:45:16

标签: r environment rdata

例如,我有一个包含列的数据框:namenmeansd。如何将列表元素提取并保存到单个rda文件中。该文件应包含生成的数据集,而不是列表。

random.r <- function(df, filename) {
  save.random <- function(name, n, mean, sd) {
    rn <- rnorm(n=n, mean=mean, sd=sd)
    assign(deparse(name), rn)
  }

  rlist <- sapply(1:nrow(df), function(x) 
    save.random(df$name[x], df$n[x],df$mean[x],df$sd[x],simplify = FALSE))
  save(list = rlist, file = paste(filename,".Rda",sep=""), envir = .GlobalEnv)    
}

干杯

1 个答案:

答案 0 :(得分:2)

诀窍是告诉R在哪里找到save中提到的对象。为此,请将列表本身作为环境提供:

save(list=names(rlist), file=..., envir=as.environment(rlist))

另请注意,list必须是对象名称的向量,因此这应该是names(rlist),而不仅仅是rlist,因为后者是数字向量列表。

以下是对random.r的修改,它可以按照您的意图运行。在这篇文章的最后,我还提供了实现相同的简化代码。

random.r <- function(df, filename) {
  save.random <- function(name, n, mean, sd) {
    rnorm(n=n, mean=mean, sd=sd)
  }

  rlist <- setNames(lapply(1:nrow(df), function(x) {
    save.random(df$name[x], df$n[x], df$mean[x], df$sd[x])
  }), df$name)
  save(list = names(rlist), file = paste0(filename, ".rda"), 
       envir = as.environment(rlist))    
}

上面的关键更改是names(rlist)作为要保存的元素名称列表(向量)的规范,as.environment(rlist)作为您希望R在其中搜索对象的环境那些名字。另请注意,我已使用setNames正确指定df$name的元素作为rlist的结果元素的名称。

简化版本为:

rlist <- setNames(mapply(rnorm, d$n, d$mean, d$sd), d$name)
save(list=names(rlist), file='~/../Desktop/foo.rda', 
     envir=as.environment(rlist))

其中d是您的data.frame。在这里,mapply是一个方便的捷径;它同时逐步执行向量d$nd$meand$sd,每次都执行rnorm

如果需要,简化代码当然可以包含在函数中,例如:

f <- function(x, filename) {
  rlist <- setNames(mapply(rnorm, x$n, x$mean, x$sd), x$name)
  save(list=names(rlist), file=paste0(filename, '.rda'), 
       envir=as.environment(rlist))
}

d <- data.frame(name=LETTERS, n=sample(100, 26), mean=runif(26), sd=runif(26),
                stringsAsFactors=FALSE)

f(d, '~/../Desktop/foo')