【问题标题】:Save elements of a list to ".Rda" file inside a function将列表的元素保存到函数内的“.Rda”文件
【发布时间】:2014-02-16 08:45:16
【问题描述】:

例如,我有一个包含列的数据框: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)    
}

干杯

【问题讨论】:

  • 您的代码块是否尝试执行您请求帮助的操作?不知道你到底打算random.r 做什么。
  • @jbaums 是的,只是修改了代码以使其更简单,因为它涉及很多方程式。我希望“保存”仅包含 rlist 元素而不包含列表本身。
  • @jbaums 我很抱歉。已编辑代码以仅反映一个功能。将封装调整为 random.r 和 rlist 似乎是不同的功能。 rlist 在 random.r 内
  • 感谢您更正代码 - 我已经编辑了我的答案,现在应该可以解决您的问题。您的代码有几个问题:rlist 的元素没有被正确命名;未正确指定要保存的元素名称向量;并且搜索环境错误。
  • @jbaum 睡眠不足让我头晕目眩

标签: r environment rdata


【解决方案1】:

诀窍是告诉 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 搜索具有这些名称的对象的环境。另请注意,我已使用setNamesdf$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')

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2021-11-13
    相关资源
    最近更新 更多