Tôi đã cố gắng sử dụng acast
từ reshape2
trong chức năng tự viết, nhưng có vấn đề là acast không tìm thấy dữ liệu tôi gửi cho nó.Làm thế nào để sử dụng acast (reshape2) trong một hàm trong R?
Đây là dữ liệu của tôi:
library("reshape2")
x <- data.frame(1:3, rnorm(3), rnorm(3), rnorm(3))
colnames(x) <- c("id", "var1", "var2", "var3")
y <-melt(x, id = "id", measure = c("var1", "var2", "var3"))
y
sau đó trông như thế này:
id variable value
1 1 var1 0.1560812
2 2 var1 1.0343844
3 3 var1 -1.4157728
4 1 var2 0.8808935
5 2 var2 0.1719239
6 3 var2 0.6723758
7 1 var3 -0.7589631
8 2 var3 1.1325995
9 3 var3 -1.5744876
bây giờ tôi có thể bỏ nó trở lại qua acast
:
> acast(y,y[,1] ~ y[,2])
var1 var2 var3
1 0.1560812 0.8808935 -0.7589631
2 1.0343844 0.1719239 1.1325995
3 -1.4157728 0.6723758 -1.5744876
Tuy nhiên, khi viết một nhỏ wrapper cho acast
mà nên làm như vậy, tôi nhận được một stupid thông báo lỗi:
wrap.acast <- function(dat, v1 = 1, v2 = 2) {
out <- acast(dat, dat[,v1] ~ dat[,v2])
return(out)
}
wrap.acast(y)
Error in eval(expr, envir, enclos) : object 'dat' not found
Vấn đề rõ ràng là có liên quan đến môi trường và biến toàn cầu/cục bộ. Vì nó cung cấp các thông báo lỗi khác sau khi khai báo dat
trong môi trường toàn cầu (tức là, v1
và v2
không được tìm thấy miễn là chúng không phải là toàn cầu).
Tôi muốn sử dụng resahpe (đặc biệt là acast) trong một hàm mà không cần phải khai báo các biến bên ngoài hàm. Bí quyết là gì?
Cảm ơn.
Đây là vấn đề xảy ra thường xuyên hơn gần đây. Ban đầu tôi thấy nó là một vấn đề với phương pháp S4, nhưng dường như nó có thể xảy ra với các chức năng khác nữa. Đây được cho là lỗi trong R, xem thêm câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/3574858/values-not-being-copied-to-the-next-local-environment/ –
Cảm ơn Joris. Nhưng bây giờ tôi có ấn tượng rằng không có giải pháp dễ dàng cho vấn đề của tôi. không quá đẹp ... – Henrik
Chỉ cần phát hiện ra có một thực sự. Đó là vấn đề chính xác của việc in ấn. –