質問

電話をかける方が便利なコードがあります 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"))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top