بالإشارة إلى المشكلة رقم 713 ، أعتقد أنني وجدت للتو خطأً ذا صلة.
إعلان وتمرير دالة تجميع _ داخل_ وظيفة تستدعي dcast.data.table فشل على جهازي
الإصدار R 3.2.2 (2015-08-14)
النظام الأساسي: x86_64-apple-darwin13.4.0 (64 بت)
يعمل تحت: OS X 10.10.2 (Yosemite)
data.table_1.9.6
هنا مثال:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
#test dcast.data.table within function with internally declared aggregate fun -> FAILS
test_dcast_dt2 <- function(data) {
testfunc2 <- function(x) {
sum(x)
}
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=testfunc2)
}
res2=test_dcast_dt2(testdata)
من المثير للاهتمام أن نرى فشل هذه الحالة أيضًا:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
test_dcast_dt <- function(data, aggfunc) {
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=aggfunc)
}
custom_sum <- function(x) {
sum(x)
}
res=test_dcast_dt(testdata, custom_sum)
يبدو لي أن المشكلة رقم 713 تم إصلاحها فقط إذا كان اسم المتغير للوظيفة التي تم تمريرها هو دائمًا "fun.aggregate":
يعمل هذا المثال على عكس المثال السابق:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
test_dcast_dt <- function(data, fun.aggregate) {
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=fun.aggregate)
}
custom_sum <- function(x) {
sum(x)
}
res=test_dcast_dt(testdata, custom_sum)
أعتقد أنني أواجه مشكلة مع هذا الخطأ ، لكنني أردت التأكد من أنها كانت نفس المشكلة. كنت أحاول تحديد fun.aggregate داخل دالة قبل استدعاء dcast. مثال تافه:
wrapper <- function() {
f <- function(x) list(x)
dcast(data, y ~ x + b, fun.aggragate = f)
}
لقد حاولت محاولة العثور على f باستخدام get () من خلال استهداف بيئات sys.call محددة. حاولت أيضًا إرفاق f في new.env () من بيئة أساسية. إذن ، هل التعليق "d0rg0ld الذي تم التعليق عليه في 2 أكتوبر 2015" لا يزال هو أفضل طريقة في الوقت الحالي؟
السؤال ذو الصلة في SO: لا تتعرف وظيفة R data.table على وسيطة محددة بالفعل
التعليق الأكثر فائدة
يبدو لي أن المشكلة رقم 713 تم إصلاحها فقط إذا كان اسم المتغير للوظيفة التي تم تمريرها هو دائمًا "fun.aggregate":
يعمل هذا المثال على عكس المثال السابق: