Как использовать acast (reshape2) внутри функции в R?

Я пытался использовать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 в глобальной среде (т.е.v1 а такжеv2 не найдены, пока они не являются глобальными).

Я хотел бы использовать resahpe (особенно acast) внутри функции без необходимости объявления переменных вне функции. В чем подвох?

Благодарю.

 Joris Meys22 сент. 2010 г., 14:55
Просто обнаружил, что есть на самом деле. Это вопрос правильной типизации.
 Henrik22 сент. 2010 г., 14:35
Спасибо, Джорис. Но сейчас у меня складывается впечатление, что не существует простого решения моей проблемы. не слишком приятно ...
 Joris Meys22 сент. 2010 г., 14:24
Это проблема, которая встречается чаще в последнее время. Первоначально я обнаружил, что это проблема с методами S4, но, очевидно, это может произойти и с другими функциями. Это предположительно ошибка в R, см. Также ответы на этот вопрос:stackoverflow.com/questions/3574858/...

Ответы на вопрос(2)

Одна проблема заключается в том, что вы злоупотребляете формулой в R. Вы не должны делать такие вещи, как

> acast(y, y[,1] ~ y[,2])
        var1       var2         var3
1  2.1726117  0.6107264  0.291446236
2  0.4755095 -0.9340976 -0.443291873
3 -0.7099464 -1.2536334  0.001105352

поскольку биты 'y' являются избыточными, если предоставляется объект данных. Если вы ссылаетесь на переменные y по имени непосредственно в формуле, все работает хорошо

> acast(y, id ~ variable)
        var1       var2         var3
1  2.1726117  0.6107264  0.291446236
2  0.4755095 -0.9340976 -0.443291873
3 -0.7099464 -1.2536334  0.001105352

и код гораздо более читабелен во второй версии.

Чтобы делать то, что вы хотите, используяacast Обертка будет включать в себя создание правильной формулы с использованиемnames, как указывает Йорис, и решение Хэдли намного проще. Таким образом, моя точка зрения заключается в том, чтобы внимательно следить за тем, как вы используете формулу в R.

Решение Вопроса

вола:

acast(y, list(names(y)[1], names(y)[2]))
 Henrik22 сент. 2010 г., 16:44
Это еще проще. Большое спасибо. И еще больше спасибо за предоставление reshape2 и всех ваших замечательных пакетов!

Ваш ответ на вопрос