Data.table: dcast.data.table eval (fun.aggragate) - не работает при вызове внутри функции с объявлением внутренней функции агрегации

Созданный на 2 окт. 2015  ·  4Комментарии  ·  Источник: Rdatatable/data.table

Что касается проблемы №713, я думаю, что обнаружил связанную ошибку.

Объявление и передача функции агрегирования _в_ функции, вызывающей dcast.data.table, не работает на моем компьютере

R версия 3.2.2 (14.08.2015)
Платформа: 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)

Самый полезный комментарий

Мне кажется, что проблема №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 commentated on Oct 2, 2015" по-прежнему лучшим подходом в настоящее время?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги