Câu hỏi Làm thế nào để đặt tên biến trên bay?


Có thể tạo tên biến mới khi đang di chuyển không?

Tôi muốn đọc các khung dữ liệu từ danh sách thành các biến mới với cá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 không?


74
2018-04-20 22:38


gốc


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


Các câu trả lời:


Sử dụng assign:

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

101
2018-04-20 23:03



Đâ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 ưa thích. - Ari B. Friedman
Câu trả lời hầu như luôn luôn là "không" trừ khi nó không phải là. - Shane
Tất nhiên. Nhưng hầu hết mọi người tìm kiếm câu trả lời này không làm như vậy từ một vị trí đã từ chối một danh sách cho ứng dụng 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 tôi lưu trong mypackage / data. Mỗi tệp trong cùng một tệp của nó có cùng tên cho tệp và dữ liệu trong đó (được đưa ra các đề xuất R cho dữ liệu trong gói). Mỗi tập dữ liệu là khoảng 10M và tổng số là ~ 17Go Tôi hầu như không nhìn thấy một cách khác. - cmbarbu
Điều gì sẽ xảy ra nếu biến mới của tôi là tên cột và tôi muốn đặt tên nó trên bay như XYZ $ gán ... Tôi đoán tôi không thể sử dụng nó như thế này? - Abhishek Singh


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

Thông thường, bạn đang tạo một danh sách các biến được phân biệt bởi không có gì 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 thì, assign chỉ là những gì bạn muốn.


30
2018-04-21 00:11



Tôi đồng ý. Thông thường khi mọi người nghĩ rằng họ muốn đặt tên biến trên bay, những gì họ thực sự muốn là một cấu trúc dữ liệu khác nhau. - Michael Dunn
+1 (Câu hỏi thường gặp 7.21: cran.r-project.org/doc/FAQ/… ) thảo luận về điều này độc đáo - Ben Bolker


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

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

Nó dễ dàng hơn để đặt tên các phần tử của danh sách và lặp qua các tên.

Theo như đính kèm là có liên quan, thực hành lập trình thực sự xấu 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.


9
2017-10-07 13:21



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


Một giải pháp khôn lanh khác là đặt tên các phần tử của danh sách và attach nó:

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

0
2018-04-21 09:33



khôn lanh, nhưng không khôn ngoan. nếu câu trả lời là attach bạn thường hỏi câu hỏi sai ... - Ben Bolker


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ư một nối), và ASSIGN khi bạn muốn gán một 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 là 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 vector ký tự có chiều dài lớn hơn một sẽ được sử dụng, với một cảnh báo.

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


0
2018-04-04 22:01





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 đặt, dòng đầu tiên bị thiếu và sau đó cung cấp cho bạn thông báo lỗi.


-2
2017-10-27 19:06



Điều này không giải quyết được câu hỏi của OP. Chúng tôi có một danh sách với các khung dữ liệu và chúng tôi muốn gán nó cho các khung dữ liệu, được đặt tên là orca1, orca2, v.v. - zx8754
"Danh sách với dataframes" = "danh sách các dataframes"? - Mox