诀窍是告诉 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$n
,d$mean
并d$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')