2012-03-16 27 views
5

Tôi có hai đoạn mã tôi thường sử dụng trong đó tôi sử dụng <<- để gán cho môi trường Toàn cầu từ bên trong một hàm. Tôi biết tôi nên sử dụng assign vì nó cho phép kiểm soát tốt hơn và dễ dự đoán hơn. Tôi cố gắng để quấn quanh đầu tôi sử dụng assign nhưng không thể chuyển mã <<- mã có sử dụng gán:Cách tránh << - bằng cách chỉ định

một tập dữ liệu GIẢ VÀ CÁC hai đoạn mã QUAN ĐẾN VIỆC <<-

#CREATE A FAKE DATA SET 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
#Use split to make a list of data frames 
LIST <- split(df, df$g) #split it into a list of data frames 
NAMES <- names(LIST) #save the names of this for later use 
LIST <- lapply(seq_along(LIST), function(x) as.data.frame(LIST[[x]])[, 1:2]) 

#THE TWO PIECES OF CODE THAT USE <<- 
#Use Global Assignment to Change All Variable Names of Data Frames in a List 
lapply(seq_along(LIST), function(x) names(LIST[[x]]) <<- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)] 
) 
LIST 

#Rename All the Data Frames in the List Using Global Assignment 
lapply(seq_along(LIST), function(x) names(LIST)[[x]] <<- NAMES[x]) 
LIST 

Nỗ lực sử dụng của tôi để chỉ định:

lapply(seq_along(LIST), function(x) { 
    assign(names(LIST[[x]]), 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)], envir=.GlobalEnv) 
    } 
) 
LIST 

lapply(seq_along(LIST), function(x) assign(names(LIST)[[x]], 
    NAMES[x], envir=.GlobalEnv)) 
LIST 

Hãy giúp tôi làm điều này một cách chính xác và khắc phục những gì là sai với cách tiếp cận của tôi. Cảm ơn bạn trước.

+1

tên của đối tượng không phải là 'tên' trong môi trường, do đó bạn không thể sử dụng' assign' tại đây. – kohske

+0

@kohske Cảm ơn bạn. Bạn có thể cho điều đó cho câu trả lời sau đó và tôi sẽ chấp nhận nó? –

Trả lời

2

Tôi nghĩ rằng đây là điều tương tự

LIST <- lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}) 
LIST 

names(LIST) <- NAMES 
LIST 

hay, sử dụng gán

assign("LIST", lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}), pos=.GlobalEnv) 
+0

Tôi thích nó ở chỗ tôi không phải sử dụng 'assign' hoặc' << - '. –

3

Tôi không hiểu lý do tại sao bạn đã thực hiện nhiệm vụ này nên rất phức tạp. Đây không phải là chỉ:

LIST <- df[, 1:2] 
names(LIST) <- sapply(strsplit(names(LIST), '.', fixed = TRUE), `[`, 1) 
LIST <- split(LIST, df$g) 

tức là bạn muốn 2 cột đầu tiên là df; bạn muốn tên trước . và bạn chia khung dữ liệu. Sắp xếp lại các nhiệm vụ của bạn và bạn sẽ có một cái nhìn rõ ràng hơn về vấn đề này.

BTW, <<- không nhất thiết phải là động vật khủng khiếp; bạn có thể sử dụng nó rất an toàn bằng cách tạo tên biến trong môi trường hàng đầu, ví dụ:

x <- 0 
f <- function() x <<- 1 

Sự nguy hiểm chỉ tồn tại nếu bạn không tạo tên biến ở tất cả trong bất kỳ nơi, do đó R có đi tất cả các con đường lên đối với môi trường toàn cầu, và đó thường là một thói quen rất xấu.

+0

vui lòng bỏ qua dữ liệu có thể tái sản xuất. Nó chỉ là để thiết lập các vấn đề phát sinh trong nhiệm vụ của tôi. Giải pháp của bạn chỉ hoạt động nếu dữ liệu đơn giản và được tạo ra từ một khung dữ liệu và 'split' mà nó không có. GSee trả lời vấn đề rất độc đáo. 1 cho thông tin về bài tập toàn cầu. –

Các vấn đề liên quan