我试图在自写函数中使用acast中的reshape2,但是存在一个问题,即acast找不到我发送给它的数据。

这是我的数据:

library("reshape2")
x <- data.frame(1:3, rnorm(3), rnorm(3), rnorm(3))
colnames(x) <- c("id", "var1", "var2", "var3")
y <-melt(x, id = "id", measure = c("var1", "var2", "var3"))
y 看起来像这样:
  id variable      value
1  1     var1  0.1560812
2  2     var1  1.0343844
3  3     var1 -1.4157728
4  1     var2  0.8808935
5  2     var2  0.1719239
6  3     var2  0.6723758
7  1     var3 -0.7589631
8  2     var3  1.1325995
9  3     var3 -1.5744876

现在我可以通过 acast 将它转换回来:
> acast(y,y[,1] ~ y[,2])
        var1      var2       var3
1  0.1560812 0.8808935 -0.7589631
2  1.0343844 0.1719239  1.1325995
3 -1.4157728 0.6723758 -1.5744876

但是,当为 acast 编写一个应该做同样的小包装时,我收到一条愚蠢的错误消息:
wrap.acast <- function(dat, v1 = 1, v2 = 2) {
    out <- acast(dat, dat[,v1] ~ dat[,v2])
    return(out)
}

wrap.acast(y)

Error in eval(expr, envir, enclos) : object 'dat' not found

问题显然与环境和全局/局部变量有关。由于在全局环境中声明dat后会给出其他错误消息(即,只要不是全局的,就不会找到v1v2)。

我想在函数内使用resahpe(尤其是acast),而无需在函数外声明变量。诀窍是什么?

谢谢。

最佳答案

而不是使用公式规范,使用字符规范:

acast(y, list(names(y)[1], names(y)[2]))

10-06 10:01