Функция внутри функции не активируется должным образом - PullRequest
2 голосов
/ 23 сентября 2010

У меня есть функция, которую я использую для «быстрого просмотра» data.frame ... Я имею дело с большим количеством данных опроса, и это действует как быстрый инструмент, чтобы увидеть, что к чему.

f.table <- function(x) {

    if (is.factor(x[[1]])) { 
        frequency <- function(x) {
            x <- round(length(x)/n, digits=2)
        }
        x <- na.omit(melt(x,c()))
        x <- cast(x, variable ~ value, frequency)
        x <- cbind(x,top2=x[,ncol(x)]+x[,ncol(x)-1], bottom=x[,2])
    }

    if (is.numeric(x[[1]])) {
        frequency <- function(x) { 
            x[x > 1] <- 1
            x[is.na(x)] <- 0
            x <- round(sum(x)/n, digits=2) 
            } 

        x <- na.omit(melt(x))
        x <- cast(x, variable ~ ., c(frequency, mean, sd, min, max))
        x <- transform(x, variable=reorder(variable, frequency))
    }

return(x) 
}

Я обнаружил, что если я не определяю «частоту» вне функции, он возвращает сомнительные результаты для фреймов данных с непрерывными переменными.Кажется, не имеет значения, какое определение я использую вне функции, пока я это делаю.

try:

n <- 100    
x <- data.frame(a=c(1:25),b=rnorm(100),c=rnorm(100))
x[x > 20] <- NA 

Теперь выберите одну из частотных функций, вставьте их и попробуйте снова:

frequency <- function(x) {
                x <- round(length(x)/n, digits=2)
            }
f.table(x)

Почему это так?

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Очень важно, я думаю, что это где ваша проблема.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 (в вашей версии) вне функции.Всегда передавайте переменные, которые вам нужны, в качестве аргументов.

0 голосов
/ 23 сентября 2010

У меня нет пакета, содержащего melt, но есть несколько потенциальных проблем, которые я вижу:

  1. Ваши frequency функции не return ничего.
  2. Обычно неправильно изменять входы функций (x - это вход и - выход).
  3. В пакете stats в базе R уже есть общая frequency функция, которая может вызвать проблемы с диспетчеризацией метода (я не уверен).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...