【问题标题】:Error in eval(expr, envir, enclos) : could not find functioneval 中的错误(expr、envir、enclos):找不到函数
【发布时间】:2017-03-03 12:03:53
【问题描述】:

我一直收到这个错误:

 Error in eval(expr, envir, enclos) : 
 could not find function "aggregation.method"

例子:

#sample data
Date.Time<- seq(ISOdate(2000,1,1), by = "min" , length.out = 200)
rh <- as.data.table(cbind(Date.Time,rnorm(200),rnorm(200),rnorm(200)))
colnames(rh) <- c("Date.Time", "A", "B", "C")
rh$Date.time <- as.POSIXct( rh$Date.Time, origin = "1970-01-01" )

#Custom function
Custom.data.wrangle<-function(x, timeinterval, aggregation.method)
{
  require(data.table)

  x$Date.Time <- as.POSIXct(as.integer(as.numeric(x$Date.Time) / (60 * timeinterval)) * (60 * timeinterval),
                            origin = "1970-01-01" ,
                            tz = "GMT")# Rounddown POSIXct in a simple form.

  x<-melt(x, id= "Date.Time")

  x<-dcast(x, Date.Time~variable, fun.aggregate = aggregation.method, na.rm=TRUE)  #Restructure the table
  return(x)
}

rh<- Custom.data.wrangle(rh, 30, mean)

我尝试了引号、noquote 的组合,

fun.aggregate = get(aggregation.method) 

一切都无济于事。请拯救我的理智!

【问题讨论】:

  • dcastmelt 不是基本 R 函数。请在问题文本中包含您正在使用的任何软件包的名称。
  • 您构建 data.table 的方式非常不理想。小插曲清楚地展示了如何以更好的方式做到这一点。无论如何,您应该将此报告给 data.table 错误跟踪器。这显然是dcast.data.table 的范围界定问题。
  • 你好罗兰。 data.table 仅用于可重现的示例。我时间紧迫,从来没有像这样从头开始创建它们,所以我不关心简洁的代码。感谢您对错误跟踪器的建议。

标签: r data.table


【解决方案1】:

我不确定这是预期行为还是错误,但以下似乎可行:

f <- function(agg.fun) {
    dcast(
        DT, 
        time ~ variable, 
        fun.aggregate = eval(substitute(agg.fun)),
        #               ^^^^^^^^^^^^^^^^^^^^^^^^^
        na.rm = TRUE
    )
}

f(mean)
#     time    weight
#  1:    0  41.06000
#  2:    2  49.22000
#  3:    4  59.95918
#  4:    6  74.30612
#  5:    8  91.24490
#  6:   10 107.83673
#  7:   12 129.24490
#  8:   14 143.81250
#  9:   16 168.08511
# 10:   18 190.19149
# 11:   20 209.71739
# 12:   21 218.68889

library(data.table)
DT <- melt(
    setnames(
        as.data.table(ChickWeight),
        names(ChickWeight), tolower(names(ChickWeight))
    ),
    id = 2:4
)

【讨论】:

  • 至少,它似乎没有记录在案。
  • 标记为已回答 - 它对我有用。我将阅读 eval() 函数。非常感谢!
  • 你打赌;请注意,如果可能,在大多数情况下应避免使用eval,因此我怀疑这可能是dcast.data.table 函数中的错误/无意行为。您可能需要通过检查 discussion of this on the package repository 来确认,或者如果尚未解决,请在此处提交新问题。
  • 感谢 nrussel 的链接。我检查了板子,它就在那里,编号 #1369。