Tôi có câu hỏi về phạm vi trong đó tên hàm trong data.table::dcast
cuộc gọi được đánh giá (data.table
phiên bản 1.9.6, R 3.2.2).Tên chức năng động/riêng trong dcast.data.table
Tôi muốn tạo tên hàm, nhưng điều này không thành công.
Dưới đây là những gì tôi đã cố gắng:
library(data.table)
DT <- data.table(value = c(1:10),
cat1 = c("a", "b", "a", "b", "a", "b", "a", "b", "c", "a"),
cat2 = c("x", "x", "x", "y", "y", "y", "y", "y", "y", "x"))
này hoạt động tốt:
result1 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = sum)
Bây giờ tôi làm cho chức năng của riêng tôi, mà cũng làm việc:
f1 <- function(x) {
y <- sum(x)^2
return(y)
}
result2 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = f1)
Ở đây tôi làm điều tương tự, nhưng tôi đang tạo một hàm riêng trong một hàm. Tuy nhiên, điều này không thành công với Error in eval(expr, envir, enclos) : could not find function "f2"
.
Nếu tôi thay thế f2 bằng f1 nó hoạt động và gọi f1. Dường như nó đang xem xét môi trường toàn cầu để đánh giá biểu thức fun = f2, và f2 chỉ tồn tại trong phạm vi cục bộ.
testFunction <- function(DT1) {
f2 <- function(x) {
y <- sum(x)^2
return(y)
}
r3 <- dcast.data.table(DT1,cat1 ~ cat2, value.var = "value", fun = f2)
return(r3)
}
result3 <- testFunction(DT)
Có cách nào khác không? Những gì tôi thực sự muốn làm là làm cho tên hàm f2 năng động, để tôi truyền vào, giả sử, "f3", và nó sẽ gọi hàm f3 riêng.
tôi sẽ hy vọng rằng một cái gì đó giống như
functionName = "f3"
r3 <- dcast.data.table(DT1, cat1 ~ cat2, value.var = "value", fun = get(functionName))
... sẽ làm cho tôi ở đó, nhưng điều này dường như không làm việc. Ý tưởng nào?
Tôi nghĩ điều này giống với [bug # 1369] (https://github.com/Rdatatable/data.table/issues/1369) - chưa được khắc phục. – Arun
Câu hỏi đầu tiên tuyệt vời với một vấn đề được mô tả rõ ràng, dữ liệu đồ chơi và mã bạn đã thử. Chào mừng bạn đến với SO! Và +1 tất nhiên. – Henrik