函数内的函数未按预期激活

时间:2010-09-23 02:23:24

标签: r

我有一个功能,我用它来快速查看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) 
}

我发现如果我没有在函数之外定义“频率”,它会返回具有连续变量的数据帧的不稳定结果。只要我这样做,在函数之外使用哪个定义似乎并不重要。

尝试:

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 个答案:

答案 0 :(得分:1)

至关重要的是,我认为这就是你的问题所在。 cast()正在评估这些函数,而不参考它所调用的函数。在cast()内,它会通过fun.aggregatefunstofun进行评估,虽然我并不真正关注它正在做的事情,但却得到的是stats:::frequency,而不是您当地的。{/ p>

因此我对你的问题发表评论。你有什么功能要做?目前,似乎有必要在全球环境中定义“频率”功能,以便cast()funstofun()找到它。给它一个唯一的名称,这样它就不可能与任何东西发生冲突,所以它应该是唯一找到的东西,比如.Frequency()。不知道你想对函数做什么(而不是你认为函数[f.table]应该做什么),提供进一步的指导有点困难,但为什么没有.FrequencyNum()和{{1}在全局工作空间中定义并重写您的.FrequencyFac()包装器调用以使用相关的调用?

f.table()

我认为哪个会起作用,但它找不到N,它应该是。所以也许我在这里错过了什么?

顺便说一句,依靠从函数外部找到.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) } (在您的版本中)的函数可能不是一个好主意。始终传递您需要的变量作为参数。

答案 1 :(得分:0)

我没有包含melt的软件包,但我可以看到一些潜在的问题:

  1. 您的frequency函数没有return任何内容。
  2. 改变函数输入通常是不好的做法(x是输入输出。)
  3. 基础R中的frequency包中已存在通用stats函数,这可能会导致方法调度问题(我不确定)。