2012-03-16 17 views
5

私は頻繁に使用する2つのコードを使用して、<<-を使用して関数内からグローバル環境に割り当てます。私はそれがより良い制御を提供し、より予測可能なので私がassignを使用すべきであることを知っています。私はassignを使用してのまわりで私の頭をラップしようとしていますが、割り当て使用するコードに<<-コードを転送することはできません。<<使用を避ける方法 -

FAKEデータセットと<<-

#CREATE A FAKE DATA SET 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
#Use split to make a list of data frames 
LIST <- split(df, df$g) #split it into a list of data frames 
NAMES <- names(LIST) #save the names of this for later use 
LIST <- lapply(seq_along(LIST), function(x) as.data.frame(LIST[[x]])[, 1:2]) 

#THE TWO PIECES OF CODE THAT USE <<- 
#Use Global Assignment to Change All Variable Names of Data Frames in a List 
lapply(seq_along(LIST), function(x) names(LIST[[x]]) <<- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)] 
) 
LIST 

#Rename All the Data Frames in the List Using Global Assignment 
lapply(seq_along(LIST), function(x) names(LIST)[[x]] <<- NAMES[x]) 
LIST 

WITH CODEを2枚私の使用しようとする試み:

lapply(seq_along(LIST), function(x) { 
    assign(names(LIST[[x]]), 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)], envir=.GlobalEnv) 
    } 
) 
LIST 

lapply(seq_along(LIST), function(x) assign(names(LIST)[[x]], 
    NAMES[x], envir=.GlobalEnv)) 
LIST 

私はこれを正しく行い、私のアプローチに間違っている点を助けてください。前もって感謝します。

+1

オブジェクトの名前は環境内の 'name'ではないので、ここで' assign'を使うことはできません。 – kohske

+0

@kohskeありがとうございます。あなたは答えを与えることができますそれを受け入れるでしょうか? –

答えて

2

私は、これは同じこと

LIST <- lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}) 
LIST 

names(LIST) <- NAMES 
LIST 

か、あなたはとても複雑なこのタスクを作った理由を私は理解していない

assign("LIST", lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}), pos=.GlobalEnv) 
+0

私は 'assign 'や' << - 'を使う必要がない点で気に入っています。 –

3

を割り当てる使用することだと思います。これはただではありません:

LIST <- df[, 1:2] 
names(LIST) <- sapply(strsplit(names(LIST), '.', fixed = TRUE), `[`, 1) 
LIST <- split(LIST, df$g) 

つまり、あなたがdfの最初の2列にしたいです。 .の前に名前を入れ、データフレームを分割します。あなたのタスクを再編成すると、問題のはっきりと分かります。

BTW、<<-は必ずしもひどい動物ではありません。トップ環境に変数名を作成することで、非常に安全に使用できます。 Rは、地球環境までのすべての道を行かなければならないので、あなたは、任意の場所でのすべての変数名を作成しないと、それは通常、非常に悪い習慣である場合

x <- 0 
f <- function() x <<- 1 

危険が唯一存在します。

+0

再現可能なデータは無視してください。私の仕事で発生する問題を設定するだけでした。あなたのソリューションは、データが単純でデータフレームから作成され、それが作成されていない「分割」の場合にのみ機能します。 GSeeは問題に非常にうまく答えました。 +1グローバル割り当てに関する情報。 –

関連する問題