13

リスト内のオブジェクトで値の割り当てを使用しようとしています。私がやりたいのは、いくつかの要素を変更することです。例えば:

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

何かご意見は?リスト(x)内のオブジェクトの名前を入力として受け取る関数を作成しているため、assignを使用する必要があります。

4

4 に答える 4

15

運が悪いようです。ヘルプファイルから:

'assign'は割り当てメソッドをディスパッチしないため、ベクトル、名前、属性などの要素を設定するために使用することはできません。

添付リストまたはデータフレームに割り当てると、元のオブジェクトではなく、添付されたコピーが変更されることに注意してください。「添付」および「with」を参照してください。

入力として渡す場合はnames(x)、次を使用できませんでした。

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

また、関数でグローバル変数を変更する予定ですか?例えば:

x <- list(test=1)

f <- function(...)
   x$test <- 2

f() # want x$test = 2 ??

これは機能しないため(スコープの問題)。少しのフットワーク()で動作させることができますが、<<-意図しないバグをコードに取り入れやすいため、これは一般的に悪い習慣と見なされます。

この機能が必要な理由/機能の目的の例を挙げていただければ、別の解決策を見つけるお手伝いをいたします。

于 2012-03-05T02:57:02.437 に答える
11

「x$test」に割り当てるとどうなるかを確認してください。

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

「x」の要素「test」はまだ1であり、それを抽出しますx$testget("x$test")、その名前から値2になります。

名前を直接使用しないのはなぜですか?つまり

this.name <- "test"
x[[this.name]] <- 2
于 2012-03-05T02:58:01.810 に答える
2

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

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=""))コマンドは、このコンテキストで非常に役立ちます。

心から

于 2012-03-18T18:32:44.123 に答える
1

<<-を試しましたか?これを使用して、昨日の投稿の関数内からリストに名前と値を割り当てました(「一連のデータフレームを結合し、それぞれのデータに新しい列を作成する」を参照)。

于 2012-03-05T03:08:54.200 に答える