При использовании summarise
, plyr
, кажется, «не видит» функцию, объявленную в глобальной среде перед проверкой функции в base
:
Мы можем проверить это, используя удобный pryr
пакет Хэдли. Вы можете установить его с помощью следующих команд:
library(devtools)
install_github("pryr")
require(pryr)
require(plyr)
c <- ddply(a, .(cat), summarise, print(where("mode")))
# <environment: namespace:base>
# <environment: namespace:base>
# <environment: namespace:base>
В принципе, это не читает/знаешь/см вашихmode
функцию. Есть два варианта. Первое - это то, что предложил @AnandaMahto, и я бы сделал то же самое, и посоветовал бы вам придерживаться этого. Другой альтернативой является не использовать summarise
и называть его с помощью function(.)
, так что функция mode
в вашей глобальной среде «виден».
c <- ddply(a, .(cat), function(x) mode(x$levels))
# cat V1
# 1 1 6
# 2 2 5
# 3 3 9
Почему это работает?
c <- ddply(a, .(cat), function(x) print(where("mode")))
# <environment: R_GlobalEnv>
# <environment: R_GlobalEnv>
# <environment: R_GlobalEnv>
Потому что, как вы видите выше, он читает вашу функцию, которая сидит в global environment
.
> mode # your function
# function(x)
# names(table(x))[which.max(table(x))]
> environment(mode) # where it sits
# <environment: R_GlobalEnv>
в противоположность:
> base::mode # base's mode function
# function (x)
# {
# some lines of code to compute mode
# }
# <bytecode: 0x7fa2f2bff878>
# <environment: namespace:base>
Here's an awesome wiki на environments
от Hadley, если вы заинтересованы в предоставлении ему чтение/изучение далее.
+1, Это лучший ответ, чем мой. Мне было слишком лениво исследовать, где plyr искал «режим», поэтому я просто переименовал и упростил его. – A5C1D2H2I1M1N2O1R2T1
Спасибо за ответ, сейчас он работает. Я пытаюсь обобщить: режим уже существует в глобальной среде, и поэтому plyr использует эту функцию, предоставленную мной. – naund
@ пользователь2126360, 'режим' в' база'. – A5C1D2H2I1M1N2O1R2T1