Bir for döngüsünde değişken adının bir listesini oluşturun, sonra bunlara değerler atayın


27

Bir for döngüsü kullanarak değişkenlerin bir listesini yapmanın ve değerini vermenin basit bir yolu olup olmadığını merak ediyorum.

for(i in 1:3)
{
  noquote(paste("a",i,sep=""))=i
}

Yukarıdaki kodda, oluşturmak deneyin a1, a2, a3, 1, 2, 3. Bununla birlikte, R, bir hata mesajı verir değerlerine olan atama. Yardımın için teşekkürler.


3
Bunu yapmak zorunda olduğunuzdan şüpheliyim - anlaşılan çok yanlış bir şey yapıyorsunuz.

@mbq, içinde Eviews örneğin bu uygulamayı kodlama oldukça normaldir.
Avukatlık

6
R ise @mpiktas, bir listesini yapmak için daha fazla doğal olarak, set namesparametre ve daha sonra ya sadece, kullanmak attachda ya da bir ortama dönüştürmek list2envve evalonun içinde. Döngü olmadan, ayrıştırma veya diğer çirkin şeyler.

@mbq, hm, list2envnispeten yeni bir fonksiyondur. Ve OP, değişkenleri en üst ortamda elde etmek istediğinde, bazı ortamdaki değişkenleri üretecektir. Yani çirkinlik hala kalıyor :)
mpiktas

2
Benzer nitelikteki gelecek sorular için, bu tür bir sorunun aslında StackOverflow'a ait olduğunu öneririm. Sorunun istatistiklerle alakası yok.
Mars,

Yanıtlar:


41

Sen arıyorsun assign().

for(i in 1:3){
  assign(paste("a", i, sep = ""), i)    
}

verir

> ls()
[1] "a1"          "a2"          "a3" 

ve

> a1
[1] 1
> a2
[1] 2
> a3
[1] 3

Güncelleştirme

Döngü kullanmanın (çok sık) kötü R kodlama tarzı olduğunu kabul ediyorum (yukarıdaki tartışmaya bakınız). Kullanarak list2env()(bahsettiği için @ mbq sayesinde), bu @Han Lin Shang'ın sorusuna başka bir çözümdür:

x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)

21

Değerler vektördeyse, döngü gerekli değildir:

vals <- rnorm(3)
n    <- length(vals)
lhs  <- paste("a",    1:n,     sep="")
rhs  <- paste("vals[",1:n,"]", sep="")
eq   <- paste(paste(lhs, rhs, sep="<-"), collapse=";")
eval(parse(text=eq))

Bir not olarak, bu yüzden R'yi seviyorum.


4
library(fortunes) fortune(106)
Roman Luštrik

@Roman, garip, parseR yardım sayfalarını okuduktan sonra kullanmaya başladım . Örneğin formulayönetimde bazen bunun bir eksiklik olduğuna katılıyorum , ancak bunu çok yararlı buldum. Sormadığım için servette önerildiği gibi soruyu tekrar düşünemeyeceğimi unutmayın.
mpiktas

1
@mpiktas: temel kapsam belirleme kurallarının bir fonksiyon içerisinde kullanıldığında öngörülemeyen sonuçlara yol açabileceği gerçeğiyle ilgilidir. Ayrıca (yardım dosyalarında belirtildiği gibi), R ve S kapsam belirleme kurallarındaki farktan dolayı farklı bir sonuç verebilir. Aynı zamanda diğer çözümlerden daha yavaştır. Bunu birçok kez ne zaman yapmanız gerektiği önemli olacaktır. Ve sonuncusu ama en önemlisi, çoğu durumda eval (parse ()) kullanmaktan daha zarif ve daha kolay bir çözüm vardır. Bu durumda listelerde çalışmak veya atama kullanmak.
Joris Meys

1
@mpiktas: Asla eksik olduğunu söylemedim. Size genel olarak bir değerlendirme (ayrıştırma) yapısının neden R çekirdek geliştirme ekibinin üyesi Thomas Lumley tarafından önerildiğinin nedenini verdim. (@Roman Lustrik'in refernce cfr)
Joris Meys

1
tam olarak, çoklu tek eleman değişkenleri oluşturmak için atama kullanmak gibi kötü uygulamalar teşvik edilmemelidir
mdsumner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.