13

次の例が発生する理由を誰かに説明できますか?

#Create simple dataframe
assign( "df" , data.frame( P = runif(5) , Q = runif(5) , R = runif(5) ) ) 

#Return the dataframe from the given character vector
get( "df" ) 
            P          Q          R
1  0.17396222 0.90994676 0.90590685
2  0.33860092 0.98078739 0.38058921
3  0.80751402 0.93229290 0.82853094
4  0.05460417 0.55448507 0.01605027
5  0.04250316 0.03808318 0.40678270

#Return the column names of df
colnames( get( "df" ) )
[1] "P" "Q" "R"

#But using a replacement function...
colnames( get( "df" ) ) <- c( "S" , "T" , "U" ) 
    Error in colnames(get("df")) <- c("S", "T", "U") : 
    target of assignment expands to non-language object

A)置換関数がこのように機能しない理由を知りたい get()ですか?

そしてb)以下に概説する私の問題を考えると、これを回避する方法がある場合;

私の問題は、次assign( paste( "Object" , i , sep = "." ) , rnorm(1000 , i) )のようなループで (おもちゃの例を使用して) 作成された多くのオブジェクトがあることです。ループ内の各オブジェクトに適用されますが、上記の例のようには機能しません。ii <- 1:1000names( get( paste( "Object" , i , sep = "." ) ) <- someNewName

しかし、それらのオブジェクトget( paste( "Object" , i , sep = "." ) )の名前 (または) を返します。NULL

ありがとう!

4

2 に答える 2

19

これが機能しない理由を理解するには、何が機能するかを理解する必要がありますcolnames<-。オブジェクトを変更しているように見えるその中のすべての関数と同様に、実際にはコピーを変更しているため、概念的には次のようcolnames(x) <- yに拡張されます。

copy <- x
colnames(copy) <- y
x <- copy

これは、通常の方法で置換オペレーターを呼び出すと、もう少しコンパクトに記述できます。

x <- `colnames<-`(x, y)

だからあなたの例は

get("x") <- `colnames<-`(get("x"), y)

右側は有効なRですが、関数の結果に何かを割り当てることができないため、コマンド全体は有効ではありません。

x <- 1
get("x") <- 2
# Error in get("x") <- 2 : 
#  target of assignment expands to non-language object
于 2013-01-22T19:16:59.440 に答える
10

質問で示した方法で使用assignすることは、R では少なくとも珍しいことです。通常は、すべてのオブジェクトをリストに入れるだけです。

だから、代わりに

for (i in 1:10) {
assign( paste( "Object" , i , sep = "." ) , rnorm(1000 , i) )}

あなたがするだろう

objects <- list()
for (i in 1:10) {
objects[[i]] <- rnorm(1000 , i) }

実際、この構成は非常に一般的であるため、(最適化された) 関数 ( lapply) があり、似たようなことを行います。

objects <- lapply(1:10, function(x) rnorm(1000,x))

次に、たとえば最初のオブジェクト as にアクセスできobjects[[1]]ます。また、リストを操作するための関数がいくつかあります。

于 2013-01-22T17:45:57.743 に答える