Hasilkan daftar nama variabel dalam for for, kemudian tetapkan nilai padanya


27

Saya bertanya-tanya apakah ada cara sederhana untuk menghasilkan daftar variabel menggunakan for for, dan memberikan nilainya.

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

Pada kode di atas, saya mencoba untuk membuat a1, a2, a3, yang menetapkan dengan nilai-nilai 1, 2, 3. Namun, R memberikan pesan kesalahan. Terima kasih atas bantuan Anda.


3
Saya ragu Anda harus melakukan ini - sepertinya Anda membuat sesuatu dengan cara yang sangat salah.

@ MBB, dalam Eviews misalnya ini adalah praktik pengkodean yang cukup normal. Bukannya saya mengadvokasi, Eviews menilai hanya sedikit lebih rendah dari Excel dalam daftar perangkat lunak jahat teratas saya :)
mpiktas

6
@mpiktas Di R, lebih alami untuk membuat daftar, mengatur namesparameternya dan kemudian menggunakannya, attachatau mengubahnya menjadi lingkungan dengan list2envdan evaldi dalamnya. Tanpa loop, parse atau hal-hal buruk lainnya

@mbq, hm, list2envadalah fungsi yang relatif baru. Dan masih akan menghasilkan variabel di beberapa lingkungan, ketika OP ingin mendapatkan variabel di lingkungan teratas. Jadi kejelekan masih ada :)
mpiktas

2
Untuk pertanyaan mendatang yang sifatnya serupa, saya sarankan bahwa pertanyaan semacam ini sebenarnya milik StackOverflow. Pertanyaannya tidak ada hubungannya dengan statistik semata.
Mars

Jawaban:


41

Anda mencari assign().

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

memberi

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

dan

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

Memperbarui

Saya setuju bahwa menggunakan loop adalah (sangat sering) gaya pengkodean R yang buruk (lihat diskusi di atas). Menggunakan list2env()(terima kasih kepada @mbq untuk menyebutkannya), ini adalah solusi lain untuk pertanyaan @Han Lin Shang:

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

21

Jika nilainya dalam vektor, loop tidak diperlukan:

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))

Sebagai catatan, ini adalah alasan mengapa saya suka R.


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

@Roman, aneh, saya sudah mulai menggunakan parsesetelah membaca halaman bantuan R. Saya setuju bahwa kadang-kadang ini adalah kerja keras, misalnya dalam formulamanajemen, tetapi saya merasa sangat berguna. Perhatikan bahwa saya tidak dapat memikirkan kembali pertanyaan seperti yang disarankan dalam kekayaan, karena saya tidak menanyakannya.
mpiktas

1
@mpiktas: ini ada hubungannya dengan fakta bahwa aturan pelingkupan yang mendasari dapat menghasilkan hasil yang tak terduga ketika digunakan dalam suatu fungsi. Juga (sebagaimana disebutkan dalam file bantuan), R dan S dapat memberikan hasil yang berbeda karena perbedaan dalam aturan pelingkupan. Ini juga lebih lambat dari solusi lain. Ini akan menjadi masalah ketika Anda harus melakukan ini berkali-kali. Dan last but not least, dalam banyak kasus ada solusi yang lebih elegan dan lebih mudah daripada menggunakan eval (parse ()). Dalam hal ini yang berfungsi dengan daftar atau menggunakan penetapan.
Joris Meys

1
@mpiktas: Saya tidak pernah mengatakan itu kurang. Saya hanya memberi Anda alasan mengapa secara umum konstruksi eval (parse ()) disarankan oleh misalnya Thomas Lumley, anggota tim pengembangan inti R. (rujuk referensi @Roman Lustrik)
Joris Meys

1
tepatnya, praktik buruk seperti menggunakan assign untuk membuat beberapa variabel elemen tunggal harus
dihilangkan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.