Очень важно, я думаю, что это где ваша проблема.cast()
оценивает эти функции без ссылки на функцию, из которой они были вызваны.Внутри cast()
он оценивает fun.aggregate
через funstofun
и, хотя я не особо слежу за тем, что он делает, получает stats:::frequency
, а не ваш локальный.
Отсюда мой комментарий к вашему Q. Что вы хотите сделать функцию?На данный момент представляется необходимым определить функцию «частоты» в глобальной среде, чтобы cast()
или funstofun()
нашли ее.Дайте ему уникальное имя, чтобы оно ни с чем не конфликтовало, поэтому это должно быть единственное найденное, скажем, .Frequency()
.Не зная, что вы хотите сделать с функцией (а не то, что, как вы думали, должна делать функция [f.table]), будет немного трудно дать дальнейшие указания, но почему бы не определить .FrequencyNum()
и .FrequencyFac()
, определенные вглобальное рабочее пространство и переписать ваши f.table()
вызовы-обертки для приведения в соответствие с соответствующим?
.FrequencyFac <- function(X, N) {
round(length(X)/N, digits=2)
}
.FrequencyNum <- function(X, N) {
X[X > 1] <- 1
X[is.na(X)] <- 0
round(sum(X)/N, digits=2)
}
f.table <- function(x, N) {
if (is.factor(x[[1]])) {
x <- na.omit(melt(x, c()))
x <- dcast(x, variable ~ value, .FrequencyFac, N = N)
x <- cbind(x,top2=x[,ncol(x)]+x[,ncol(x)-1], bottom=x[,2])
}
if (is.numeric(x[[1]])) {
x <- na.omit(melt(x))
x <- cast(x, variable ~ ., c(.FrequencyNum, mean, sd, min, max), N = N)
##x <- transform(x, variable=reorder(variable, frequency))
## left this out as I wanted to see what cast returned
}
return(x)
}
Как я думал, это сработает, но он не находит N, и так и должно быть.Так что, возможно, я что-то здесь упускаю?
Кстати, вероятно, не стоит полагаться на функцию, которая находит n
(в вашей версии) вне функции.Всегда передавайте переменные, которые вам нужны, в качестве аргументов.