Data.table: dcast.data.table EVAL (fun.aggragate) - فشل عند استدعاء دالة داخلية مع إعلان وظيفة التجميع الداخلي

تم إنشاؤها على ٢ أكتوبر ٢٠١٥  ·  4تعليقات  ·  مصدر: Rdatatable/data.table

بالإشارة إلى المشكلة رقم 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)
bug

التعليق الأكثر فائدة

يبدو لي أن المشكلة رقم 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)

ال 4 كومينتر

من المثير للاهتمام أن نرى فشل هذه الحالة أيضًا:

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" لا يزال هو أفضل طريقة في الوقت الحالي؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

alex46015 picture alex46015  ·  3تعليقات

jimhester picture jimhester  ·  3تعليقات

mattdowle picture mattdowle  ·  3تعليقات

jangorecki picture jangorecki  ·  3تعليقات

rafapereirabr picture rafapereirabr  ·  3تعليقات