2015-11-18 18 views
9

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?

+3

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

+2

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

Trả lời

3

Dựa trên báo cáo lỗi, tôi đã có thể khắc phục sự cố ngay bây giờ bằng cách sử dụng thông số có tên "fun.aggregate".

Cảm ơn bạn đã chỉ cho tôi.

Mã bên dưới hoạt động và đạt được những gì tôi cần. Tôi có thể chuyển vào một tên hàm có sẵn như hàm trung bình hoặc hàm được xác định cục bộ.

testFunction <- function(DT1,functionName="mean") { 

    f2 <- function(x) { 
     y <- sum(x)^2 
     return(y) 
    } 

    fun.aggregate <- get(functionName) 

    r3 <- dcast.data.table(DT1,cat1~cat2,value.var="value",fun.aggregate=fun.aggregate) 
    return(r3) 
} 
result3 <- testFunction(DT,"mean") 
result4 <- testFunction(DT,"f2") 
Các vấn đề liên quan