質問
電話をかける方が便利なコードがあります fix
経由 do.call
, 、直接ではなく。この例では、古いデータフレームが機能します。
dfr <- data.frame(x = 1:5, y = letters[1:5])
明らかな最初の試みはです
do.call("fix", list(dfr))
残念ながら、これは失敗します
Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name
だから、私たちはそれに名前を付けます:
do.call("fix", list(dfr = dfr))
今回は失敗します
Error in is.name(subx) : 'subx' is missing
記録のために、 edit
動作しません。
dfr <- do.call("edit", list(dfr = dfr))
誰でも賢明な回避策を考えてもらえますか?
編集:反省すると、私はそれを忘れました fix
常にその答えをグローバル環境に捨てます。これはテストの例には適していますが、機能で使用するのにはそれほど良くありません。ジョシュアの優れた回避策は、使用に拡張されていません edit
.
ボーナスポイントについては、どのように電話しますか edit
経由 do.call
?
解決
使用できます substitute
, 、これは、変数名をラベルとして使用する場合にも役立ちます。
do.call("fix",list(substitute(dfr)))
明確にするために編集します
これがどのように機能するかを見るのは簡単です call
指図:
> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)
したがって、使用するとき substitute
作成されているコマンドは、評価されたシンボルではなく、シンボルの名前を使用します。包む場合 eval
これらの式の周りでは、最初の例では遭遇したのと同じエラーが得られ、2番目の例は期待どおりに機能します。
ハドリーのリンクを読んだ後、評価されているものが明確になります。
> as.name("dfr")==substitute(dfr)
[1] TRUE
他のヒント
最初のエラーはあなたにヒントを与えます。これは機能します:
do.call(fix,list("dfr"))
あなたが使用したとしても、あなたはまだあなたの2回目のトライで同じエラーを得るでしょう dfr="dfr"
名前付きリストには引数の名前が必要だから what
(関数)。したがって、2回目の試みは次のとおりです。
do.call(fix,list(x="dfr"))
所属していません StackOverflow