1

次のコードが属性を設定するために機能する理由は非常に混乱しています。

#list of character
temp = list()
temp[[1]] = "test"
str(temp)
attr(temp[[1]], "testing") = "try"
attributes(temp[[1]])

これは

$testing
[1] "try"

しかし、名前付きリストの要素の属性を設定しようとすると、

#list of character, where list element is named
temp = list()
temp[["2ndtemp"]][[1]] = "test"
str(temp)
attr(temp[["2ndtemp"]][[1]],"testing") = "try"
attributes(temp[["2ndtemp"]][[1]])

これはを返しますNULL

次に、再帰リストを宣言すると、次のことがわかりました。

#list of a list
temp = list()
temp[["2ndtemp"]] = list()
temp[["2ndtemp"]][[1]] = "test"
str(temp)
attr(temp[["2ndtemp"]][[1]],"testing") = "try"
attributes(temp[["2ndtemp"]][[1]])

これは動作します。

さらに探索する:

#character vector
temp = "test"
str(temp)
attr(temp,"testing") = "try"
attributes(temp)

同様に機能しますが、文字を含むベクトルがある場合:

temp=vector()
temp[[1]] = "test"
str(temp)
attr(temp[[1]],"testing") = "try"
attributes(temp[[1]])

これはを返しますNULL

これらの場合にattr()関数が異なる動作をする理由を誰かに説明してもらえますか?

編集:私が設定した場合:私は例の最後のペアによって非常に混乱しています:

temp = "test"
temp2=vector()
temp2[[1]] = "test"

次にクエリを実行します。

identical(temp,temp2[[1]])

取得しTRUEます。

4

1 に答える 1

2

すべての例は異なることをします。

temp = list()
temp[["2ndtemp"]][[1]] = "test"

これにより文字ベクトルが作成[[<- され、nullオブジェクトではリストが作成されません

見る

x <- NULL
x[[1]] <- 'x'
 x
[1] "x"

を使用した例では、を呼び出すときにvectorのデフォルト値を使用しています。modevector()vector(mode = "logical", length = 0)

したがって、を割り当てるときは、からを'test'強制するだけです。それはまだ原子ベクトルであり、logicalcharacterlist

これは文字ベクトルであり、アトミックであるため、さまざまな要素にさまざまな属性を与えることはできません。

attr(x[[1]], 'try') <- 'testing'

実際には何も割り当てません(おそらく警告を表示する必要がありますが、割り当てません)。

次のヘルプページを読むと、十分なサービスが提供されます。vector

于 2013-03-14T01:28:28.843 に答える