Data.table: dcast.data.table eval (fun.aggragate) - falha quando chamado dentro da função com declaração de função de agregação interna

Criado em 2 out. 2015  ·  4Comentários  ·  Fonte: Rdatatable/data.table

Referindo-se ao problema # 713, acho que acabei de encontrar um bug relacionado.

Declarar e passar uma função de agregação _dentro_ de uma função que chama dcast.data.table falha em minha máquina

R versão 3.2.2 (2015-08-14)
Plataforma: x86_64-apple-darwin13.4.0 (64 bits)
Executando em: OS X 10.10.2 (Yosemite)
data.table_1.9.6

Aqui está um exemplo:

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

Comentários muito úteis

Parece-me que o problema # 713 foi corrigido apenas se o nome da variável para a função passada for sempre "fun.aggregate":

Este exemplo funciona em contraste com o 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 comentários

É interessante ver que este caso também falha:

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)

Parece-me que o problema # 713 foi corrigido apenas se o nome da variável para a função passada for sempre "fun.aggregate":

Este exemplo funciona em contraste com o 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)

Acho que estou tendo um problema com esse bug, mas queria ter certeza de que era o mesmo. Eu estava tentando definir um fun.aggregate dentro de uma função antes de uma chamada para dcast. Um exemplo trivial:

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

Tentei encontrar f usando get (), direcionando ambientes sys.call específicos. Eu também tentei anexar f em um new.env () do ambiente base. Então, o comentário "d0rg0ld comentou em 2 de outubro de 2015" ainda é a melhor abordagem atualmente?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

st-pasha picture st-pasha  ·  3Comentários

arunsrinivasan picture arunsrinivasan  ·  3Comentários

sengoku93 picture sengoku93  ·  3Comentários

mattdowle picture mattdowle  ·  3Comentários

DavidArenburg picture DavidArenburg  ·  3Comentários