私はあなたが欲しいと思います
lapply(all_exp_names,get)
しかし、それは実際には名前付きリストを返しません。できるよ
setNames(lapply(all_exp_names,get),all_exp_names)
確かに少し不格好ですが、頻繁に使用する場合は関数にパッケージ化できます(これに対するわずかに優れた解決策については、@ JoshOBrienの回答を参照してください)。
もっと慣用的なことは、最初にデータの参照コピーを名前付きリストに保持することだと思います。
編集: 以下の私の元の遅延代入/評価コードは巧妙でしたが、R に組み込みdelayedAssign
関数があるという点を完全に見逃していましたmakeDelayVar
。
delayedAssign("exp_all",list(exp1=exp1,exp2=exp2))
(do.call のおかげで、curve は、これを指摘するために別の関数環境内に関数をプロットすることはできません%<%
。)ただし、以下に示すように中置演算子を定義するトリックは、依然として便利な場合があります。
遅延割り当てが
本当に必要
な場合は、これが機能します(ただし、単純ではありません):
makeActiveBinding("all_exp",function() list(exp1=exp1,exp2=exp2), .GlobalEnv)
exp1 <- 2
exp2 <- 3
all_exp
## $exp1
## [1] 2
##
## $exp2
## [1] 3
makeDelayVar
評価環境に注意する必要があるかもしれませんが、これを関数でラップすることもできます。
makeDelayVar <- function(var,val) {
makeActiveBinding(deparse(substitute(var)), function() val, parent.frame())
}
makeDelayVar(all_exp, list(exp1=exp1,exp2=exp2))
all_exp
これは上記と同じように機能します (この手順が実際に遅延評価を行っていることを確認したい場合は、 and を削除exp1
しexp2
、 を定義all_exp
してから再定義できます)。exp[12]
さらに愚かなことをするため%<%
に、遅延代入を行うように定義できます (R では、中置演算子を として定義できます%[character]%
)。
`%<%` <- makeDelayVar
all_exp %<% list(exp1,exp2)
ただし、これは注意して使用します。状況によっては壊れやすい可能性があります。たとえば、それが壊れたり何かおかしいことをした場合にすぐにわかるインタラクティブなコンテキストに制限し、遅延評価の結果を引数として関数などに渡そうとしないでください。