【问题标题】:Error: object '...' not found错误:找不到对象“...”
【发布时间】:2014-07-28 13:55:52
【问题描述】:

我正在尝试使用 ddply 包编写函数。我已经阅读了几个解决方案,但我无法弄清楚如何在我的案例中解决这个问题。

Rolling <- function(ID, RP){ 
 require(plyr)
 cn=colnames(ID)
 Rolling3M=ddply(ID, cn[2:(length(cn)-1)], transform, Rolling3M = as.numeric(filter(v3,c(1,rep(1,times=RP)),sides=1)))
 return(Rolling3M)
}

 v1=c("a","a","a","a","a","a","a","b","b","b","b","b","b")
 v2=c("c","c","c","d","d","d","d","c","c","c","d","d","d")
 v3=c(1:13)
 df = data.frame(v1,v2,v3)
 output=Rolling(df, 3)

我收到此错误消息:Error: object 'RP' not found

我也想这样做:

output=ddply(df, .(v1,v2),transform, Rolling3M=as.numeric(filter(v3,c(1,rep(1,2)), sides=1)))

【问题讨论】:

  • 你是怎么调用函数的?请提供示例数据以创建reproducible example
  • 我收到一个错误,该错误也涉及到filter 的参数,但它是针对第一个参数“Freq”,而不是第二个。这对我来说更有意义,因为我没有看到任何名为“Freq”的东西。

标签: r plyr


【解决方案1】:

你有没有看过这个问题:Object not found error with ddply inside a function

看起来这是基于 ddply 函数的变量范围的问题。如果您想了解有关它的更多详细信息,可以从 Hadley(plyr 包的作者)那里获得更多关于它的信息 here。解决这个问题似乎有问题。

上面 SO 线程中评分最高的答案使用 do.call 来解决环境范围问题,使用它来调用 ddply。对于您的示例,这会将函数更改为:

Rolling <- function(ID, RP){ 
    require(plyr)
    cn <- colnames(ID)
    Rolling3M <- do.call("ddply",list(ID, cn[2:(length(cn)-1)], transform, Rolling3M <- as.numeric(filter(c,c(1,rep(1,times = RP)),sides=1))))
    return(Rolling3M)
}

它给出了输出:

  a b c
1 1 0 5
2 2 0 6
3 3 1 7
4 4 1 8

这是您期望从函数中获得的输出吗?你没有在你的问题中说。

感谢James 他在上面链接的 SO 线程中的回答。

【讨论】:

  • 我修改了示例数据,以便更清楚我想要做什么。