Gói data.table
có một số cú pháp đặc biệt yêu cầu một cú pháp sử dụng các biểu thức như các đối số i
và j
.Làm thế nào để viết một hàm gọi một hàm gọi data.table?
Điều này có một số hàm ý về cách một hàm viết chấp nhận và chuyển đối số cho các bảng dữ liệu, như được giải thích thực sự tốt trong section 1.16 of the FAQs.
Nhưng tôi không thể tìm hiểu cách thực hiện thêm một cấp độ này.
Đây là một ví dụ. Nói rằng tôi muốn viết một hàm wrapper foo()
mà làm cho một bản tóm tắt dữ liệu cụ thể của tôi, và sau đó một wrapper thứ hai plotfoo()
mà các cuộc gọi foo()
và âm mưu kết quả:
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
OK, công trình này, bởi vì tôi nhận được kết quả lập bảng của tôi :
by N
1: 4 12
2: 3 15
3: 5 5
Bây giờ, tôi cố gắng chỉ là tương tự khi viết plotfoo()
nhưng tôi thất bại thảm hại:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)
Nhưng lần này tôi nhận được một thông báo lỗi:
Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
OK, vì vậy eval()
đang gây ra một vấn đề. Hãy loại bỏ nó:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)
Ồ không, tôi nhận được một thông báo lỗi mới:
Error in `[.data.table`(data, , .N, by = list(eval(by))) :
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]
Và đây là nơi mà tôi vẫn bị mắc kẹt.
Câu hỏi: Cách viết hàm gọi hàm data.table?
Không phải là một giải pháp, nhưng nếu bạn loại bỏ 'thay thế (bởi) 'và' eval' và truyền 'bánh' thành một biến ký tự như' foo (DT, "gear") 'thì cả hai đều hoạt động. – Arun