Làm thế nào để đặt tên biến một cách nhanh chóng?


96

Có thể tạo tên biến mới một cách nhanh chóng không?

Tôi muốn đọc các khung dữ liệu từ một danh sách thành các biến mới có số ở cuối. Một cái gì đó như orca1, orca2, orca3 ...

Nếu tôi thử một cái gì đó như

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

Tôi gặp lỗi này

target of assignment expands to non-language object

Có cách nào khác để giải quyết vấn đề này?


10
Miễn là chúng tôi cung cấp thẻ r-faq, hãy cung cấp liên kết (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Câu trả lời:


118

Sử dụng assign:

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

28
Đây là cách để làm điều này. Có một câu hỏi meta ở đây là, "Tôi có nên làm điều này không?" Câu trả lời hầu như luôn luôn là "không". Các phần tử được đặt tên trong danh sách hầu như luôn được ưu tiên.
Ari B. Friedman,

26
Câu trả lời hầu như luôn luôn là "không" trừ khi nó không phải vậy.
Shane

9
Tất nhiên. Nhưng hầu hết những người tìm kiếm câu trả lời này không làm như vậy từ vị trí đã từ chối một danh sách cho đơn đăng ký của họ.
Ari B. Friedman

@Ari B. Friedman Tôi tạo tên biến cho các tập dữ liệu mà tôi lưu trong mypackage / data. Mỗi cái trong tệp của nó có cùng tên cho tệp và dữ liệu trong đó (đưa ra R khuyến nghị cho dữ liệu trong gói). Mỗi tập dữ liệu là khoảng 10 triệu và tổng số là ~ 17Go Tôi hầu như không thấy cách nào khác.
cmbarbu,

3
Có lý do gì tại sao bạn không sử dụng paste0?
BroVic

33

Dường như với tôi rằng bạn có thể được tốt hơn off với một danh sách hơn là sử dụng orca1, orca2, vv, ... sau đó nó sẽ được orca[1], orca[2]...

Thông thường, bạn đang lập một danh sách các biến được phân biệt bởi không có gì khác ngoài một số vì số đó sẽ là một cách thuận tiện để truy cập chúng sau này.

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

Nếu không, assignchỉ là những gì bạn muốn.


11
Tôi đồng ý. Thông thường khi mọi người nghĩ rằng họ muốn đặt tên cho các biến một cách nhanh chóng, điều họ thực sự muốn là một cấu trúc dữ liệu khác.
Michael Dunn

9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) thảo luận về điều này một cách độc đáo
Ben Bolker

11

Đừng tạo khung dữ liệu. Giữ danh sách, đặt tên cho các phần tử của nó nhưng không đính kèm.

Lý do lớn nhất cho điều này là nếu bạn tạo các biến khi đang di chuyển, thì hầu như sau này bạn sẽ phải lặp lại từng biến một trong số chúng để thực hiện một điều gì đó hữu ích. Ở đó, bạn sẽ lại bị buộc phải lặp lại từng cái tên mà bạn đã tạo một cách nhanh chóng.

Việc đặt tên cho các phần tử của danh sách và lặp qua các tên sẽ dễ dàng hơn nhiều.

Về phần đính kèm, thực hành lập trình thực sự tồi tệ của nó trong R và có thể dẫn đến rất nhiều rắc rối nếu bạn không cẩn thận.


Vì vậy, thực hiện một tệp đính kèm, nhưng chỉ sau khi thực hiện lặp lại qua danh sách?
Mox

4

Câu hỏi thường gặp cho biết:

Nếu bạn có

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

bạn có thể làm

get(varname[1]) + 2

cho

a + 2

hoặc là

assign(varname[1], 2 + 2)

cho

a <- 2 + 2

Vì vậy, có vẻ như bạn sử dụng GET khi bạn muốn đánh giá một công thức sử dụng một biến (chẳng hạn như nối) và ASSIGN khi bạn muốn gán giá trị cho một biến được khai báo trước.

Cú pháp gán: gán (x, giá trị)

x: một tên biến, được cho dưới dạng một chuỗi ký tự. Không có sự ép buộc nào được thực hiện và phần tử đầu tiên của một vectơ ký tự có độ dài lớn hơn một sẽ được sử dụng, với một cảnh báo.

value: giá trị được gán cho x.


0

Một giải pháp phức tạp khác là đặt tên cho các phần tử của danh sách và attachnó:

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

14
khôn lanh, nhưng không khôn ngoan. nếu câu trả lời là attachbạn thường đặt câu hỏi sai ...
Ben Bolker

-1

Và tùy chọn này?

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

Nó hoạt động hoàn hảo. Trong ví dụ bạn đưa ra, dòng đầu tiên bị thiếu, sau đó cung cấp cho bạn thông báo lỗi.


3
Điều này không giải quyết câu hỏi của OP. Chúng tôi có một danh sách với dataframes, và chúng tôi muốn gán nó vào dataframes, đặt tên như orca1, orca2 vv
zx8754

"Danh sách với khung dữ liệu" = "danh sách OF khung dữ liệu"?
Mox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.