2012-03-05 8 views
11

リスト内のオブジェクトに代入値を使用しようとしています。私がしたいことは、いくつかの要素を変更することです。例:Rでリスト要素に値を代入()しないのはなぜですか?

x <- list() 
x$test <- 1 
assign("x$test", 2) 
x$test == 1 
    [1] TRUE 

私は入力としてリスト(x)内のオブジェクトの名前を取る関数を構築しているので、assignを使う必要があります。

+0

「x $ test」と 'x [['test']]'には大きな違いがあります。 ['extract(...、drop = TRUE)'](https://stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html)の文書を参照してください。 – smci

答えて

13

あなたは幸運のようです。ヘルプファイルから:

それはベクトル、名前の 集合要素に使用することはできませんので、割り当て方法をディスパッチしません「割り当てる」、属性など

なお、譲渡添付リストにかデータフレームは元のオブジェクトではなく添付ファイル を変更します:「添付」および「with」を参照してください。

あなたが入力としてnames(x)を渡している場合は、使用できませんでした:

また
nms <- names(x) 
for (n in nms) 
    x[[n]] <- 'new_value' 

、あなたはいくつかのグローバル変数を変更するあなたの機能のために意図されていますか?例:

これは機能しません(範囲の問題)。あなたはフットワーク(<<-)のビットで動作させることができますが、これは意図的ではないバグをコードに組み込むのが簡単だから一般的に悪い習慣とみなされます。

この機能をどのような目的で使用するのかという例を挙げることができれば、代替ソリューションを見つける手助けをすることができます。

+0

素晴らしい、本当にありがとう - 私は[[n]]構文を使用することができることに気づいていませんでしたが、これは完全に十分です。情報を本当に感謝します。 – mike

8

あなたは「Xの$テスト」に割り当てたときに何が起こるかを参照してください:

x <- list() 
x$test <- 1 
assign("x$test", 2) 
ls() 
[1] "x"  "x$test" 

「X」の要素「テスト」はまだ1である、とあなたはx$testでそれを抽出したがget("x$test")が値2になりますその名前から。

なぜ名前を直接使用しないのですか?私。 -

this.name <- "test" 
x[[this.name]] <- 2 
+0

私は他の答えがなぜ受け入れられたのか分かりませんが、mdsumnerが言うように、名前を直接使わないのはなぜですか?それは絶対に完璧に動作します。 – user1052080

+0

assign()は、割り当てが行われる環境を指定することができます。これは非常に役に立ちます。これは、グローバル環境のみに割り当てられる<<とは対照的です。だから、x [[name]]は一般的な解決策ではありません(x $ name、value、envir = my_env)。 –

1

別の解決策は、次のとおりです。

x <- list() 
x$test <- 1 
assign("x$test", 2) 
x$test == 1 
TRUE 
eval(parse(text="x$test<-2")) 
x$test == 1 
FALSE 

eval(parse(text=""))コマンドは、この文脈では非常に便利です。

こんにちは

+4

トーマス・ルムリーの言い換え: "答えが解析()の場合、通常質問を再考するべきです。"より賢明な解決策があれば、このような構造を常に避けてください。ここでの解は '[[' ' –

関連する問題