2012-03-15 13 views
13

Bir gün burada bir gönderi, bir işlev içinde global ortamda birden fazla nesneye değer atamanın nasıl yapıldığını merak ediyor. Bu benim lapply (assign<<- daha güvenli olabilir, ancak aslında hiç kullanmadım ve aşina değilim) kullanma girişimi.Birden çok nesneyi .GlobalEnv öğesine bir işlev içinden atayın

#fake data set 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

#split it into a list of data frames 
LIST <- split(df, df$g) 

#pre-allot 5 objects in R with class data.frame() 
V <- W <- X <- Y <- Z <- data.frame() 

#attempt to assign the data frames in the LIST to the objects just created 
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]]) 

herhangi kısaltmak için çekinmeyin/bu işi yapmak (veya daha iyisi/hızlı çalışmasına) benim tüm kod parçaları.

+3

Bu soru veya: Senin durumunda

assign("NAME", X, envir = .GlobalEnv) 

:

Yani, örneğin, küresel ortamda NAME adında bir nesneye X değerini atamak, sen yapardın Herhangi bir cevap büyük bir "Çocuk, evde bunu yapma!" feragat. Bildiğiniz gibi, fonksiyonlar içindeki global görevler, felaket için bir reçete ya da “yanardağın yaşamı”, Richard Burns'den alıntı yapmaktır (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) – flodel

+0

@flodel Programcı değilim, bu yüzden atamakla ilgili sorunun ne olduğunu kısaca anlatabilir misiniz? –

+0

Alıntı yaptığınız bölümü okudum. Bu kişisel tüketim için değil, kişisel kod için akıllı görünüyor. Bu etkiyi elde etmenin bir yolunu görebiliyor musunuz? –

cevap

22

assign() iş için doğru bir araçtır. Onun envir argümanı, atama nerede gerçekleştiği üzerinde tam kontrol sağlar - <- veya <<- ya da mevcut olmayan kontrol.

df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
LIST <- split(df, df$g) 
NAMES <- c("V", "W", "X", "Y", "Z") 

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

ls() 
[1] "df" "LIST" "NAMES" "V"  "W"  "X"  "Y"  "Z"  
+0

Teşekkürler. Ben biliyordum << - 'kötü bir form ama tembel olmuştur. 'Atama' kullanma alışkanlığına gireceğim. Aslında tam olarak bir noktada yaptığınız şeyi yaptım, ama önceden ayrılmış olduğum için Nesnelerin etrafına tırnak işaretleri koymamam gerektiğini düşündüm. Bu nasıl daha kolay. –

+0

Evet. 'A (a)' yı kullanmak, denemeden önce üstesinden gelmek için bir kambur gibi görünen şeylerden biridir, ama bir kez yaptıktan sonra, neden ilk etapta hiç tereddüt ettiğinizi merak ediyorsunuz. –

+0

+1 - altın. Bir ortamdaki tüm nesneleri şimdiki küresel ortama vermek zorunda kaldım ve bu çözüm beni düşünmek zorunda bıraktı. – ricardo

İlgili konular