Bagaimana memberi nama variabel dengan cepat?

96

Apakah mungkin untuk membuat nama variabel baru dengan cepat?

Saya ingin membaca bingkai data dari daftar menjadi variabel baru dengan angka di akhir. Sesuatu seperti orca1, orca2, orca3 ...

Jika saya mencoba sesuatu seperti

paste("orca",i,sep="")=list_name[[i]]

Saya mendapatkan kesalahan ini

target of assignment expands to non-language object

Apakah ada cara lain untuk mengatasi ini?

Maiasaura
sumber
10
Selama kami memberikan tag r-faq, mari berikan tautannya (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Jawaban:

118

Penggunaan assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
Shane
sumber
28
Beginilah cara melakukan ini. Ada pertanyaan meta di sini, "Haruskah saya melakukan ini?" Jawabannya hampir selalu "tidak". Elemen bernama dalam daftar hampir selalu disukai.
Ari B. Friedman
26
Jawabannya hampir selalu "tidak" kecuali jika tidak.
Shane
9
Ya tentu saja. Tetapi kebanyakan orang yang mencari jawaban ini tidak melakukannya dari posisi menolak daftar untuk lamaran mereka.
Ari B. Friedman
@Ari B. Friedman Saya membuat nama variabel untuk dataset yang saya simpan di mypackage / data. Masing-masing di filenya dengan nama yang sama untuk file dan data di dalamnya (diberikan rekomendasi R untuk data dalam paket). Setiap dataset sekitar 10M dan totalnya ~ 17Go. Saya hampir tidak melihat cara lain.
cmbarbu
3
Apakah ada alasan mengapa Anda tidak menggunakannya paste0?
BroVic
33

Sepertinya saya bahwa Anda mungkin akan lebih baik dengan daftar daripada menggunakan orca1, orca2, dll, ... maka akan orca[1], orca[2]...

Biasanya Anda membuat daftar variabel yang hanya dibedakan oleh angka karena angka itu akan menjadi cara mudah untuk mengaksesnya nanti.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

Jika tidak, assignhanya apa yang Anda inginkan.

John
sumber
11
Saya setuju. Biasanya ketika orang berpikir mereka ingin memberi nama variabel dengan cepat, yang sebenarnya mereka inginkan adalah struktur data yang berbeda.
Michael Dunn
9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) membahas ini dengan baik
Ben Bolker
11

Jangan membuat bingkai data. Simpan daftarnya, beri nama elemennya tetapi jangan lampirkan.

Alasan terbesar untuk ini adalah bahwa jika Anda membuat variabel saat dalam perjalanan, hampir selalu Anda nantinya harus mengulanginya satu per satu untuk melakukan sesuatu yang berguna. Di sana Anda sekali lagi akan dipaksa untuk mengulangi setiap nama yang telah Anda buat dengan cepat.

Jauh lebih mudah untuk menamai elemen-elemen dari daftar dan mengulang-ulang nama-nama tersebut.

Sejauh menyangkut attachment, praktik pemrogramannya yang sangat buruk di R dan dapat menyebabkan banyak masalah jika Anda tidak berhati-hati.

sidquanto
sumber
Jadi, lakukan melampirkan, tetapi hanya setelah melakukan iterasi melalui daftar?
Mox
4

FAQ mengatakan:

Jika Anda memiliki

varname <- c("a", "b", "d")

Anda dapat melakukan

get(varname[1]) + 2

untuk

a + 2

atau

assign(varname[1], 2 + 2)

untuk

a <- 2 + 2

Jadi sepertinya Anda menggunakan GET saat Anda ingin mengevaluasi rumus yang menggunakan variabel (seperti gabungan), dan ASSIGN saat Anda ingin menetapkan nilai ke variabel yang dideklarasikan sebelumnya.

Sintaks untuk menetapkan: menetapkan (x, nilai)

x: nama variabel, diberikan sebagai string karakter. Tidak ada paksaan yang dilakukan, dan elemen pertama dari vektor karakter dengan panjang lebih dari satu akan digunakan, dengan sebuah peringatan.

nilai: nilai yang akan diberikan ke x.

Mox
sumber
0

Solusi rumit lainnya adalah memberi nama elemen daftar dan attachitu:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
Marek
sumber
14
rumit, tapi tidak bijaksana. jika jawabannya attachAnda biasanya menanyakan pertanyaan yang salah ...
Ben Bolker
-1

Dan opsi ini?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Ini bekerja dengan sempurna. Dalam contoh yang Anda masukkan, baris pertama hilang, lalu memberi Anda pesan kesalahan.

gelas
sumber
3
Ini tidak menjawab pertanyaan OP. Kami memiliki daftar dengan kerangka data, dan kami ingin menetapkannya ke kerangka data, dinamai sebagai orca1, orca2, dll.
zx8754
"Daftar dengan bingkai data" = "daftar bingkai data"?
Mox