Data.table: dcast.data.table eval (fun.aggragate): falla cuando se llama dentro de la función con la declaración de función de agregación interna

Creado en 2 oct. 2015  ·  4Comentarios  ·  Fuente: Rdatatable/data.table

Refiriéndome al número 713, creo que acabo de encontrar un error relacionado.

Declarar y pasar una función de agregación _dentro de_ una función que llama a dcast.data.table falla en mi máquina

R versión 3.2.2 (2015-08-14)
Plataforma: x86_64-apple-darwin13.4.0 (64 bits)
Ejecutando bajo: OS X 10.10.2 (Yosemite)
data.table_1.9.6

Aquí hay un ejemplo:

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

Comentario más útil

Me parece que el problema # 713 se solucionó solo si el nombre de la variable para la función pasada es siempre "fun.aggregate":

Este ejemplo funciona en contraste con el anterior:

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)

Todos 4 comentarios

Es interesante ver que este caso también falla:

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)

Me parece que el problema # 713 se solucionó solo si el nombre de la variable para la función pasada es siempre "fun.aggregate":

Este ejemplo funciona en contraste con el anterior:

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)

Creo que tengo un problema con este error, pero quería estar seguro de que era el mismo problema. Estaba tratando de definir un fun.aggregate dentro de una función antes de una llamada a dcast. Un ejemplo trivial:

wrapper <- function() {
  f <- function(x) list(x)
  dcast(data, y ~ x + b, fun.aggragate = f)
}

Intenté intentar encontrar f usando get () apuntándome a entornos sys.call específicos. También intenté adjuntar f en un new.env () desde el entorno base. Entonces, ¿el comentario de "d0rg0ld comentó el 2 de octubre de 2015" sigue siendo el mejor enfoque en la actualidad?

¿Fue útil esta página
0 / 5 - 0 calificaciones