トリックは、 で参照されているオブジェクトの場所を 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')