【问题标题】:How can I see what a function inside a function does?如何查看函数内部的函数的作用?
【发布时间】:2011-11-14 12:35:09
【问题描述】:

我想知道特定函数的公式是什么。通常当我输入不带括号的函数时,它会返回一个公式,所以如果我输入sd,我会得到:

function (x, na.rm = FALSE) 
{
    if (is.matrix(x)) 
        apply(x, 2, sd, na.rm = na.rm)
    else if (is.vector(x)) 
        sqrt(var(x, na.rm = na.rm))
    else if (is.data.frame(x)) 
        sapply(x, sd, na.rm = na.rm)
    else sqrt(var(as.vector(x), na.rm = na.rm))
}
<environment: namespace:stats>

这很好。但是,如果我在加载 zoo 包的情况下键入 rollmean,它会返回:

function (x, k, fill = if (na.pad) NA, na.pad = FALSE, align = c("center", 
    "left", "right"), ...) 
{
    UseMethod("rollmean")
}
<environment: namespace:zoo>

我猜想rollmean 方法中发生了一些事情,但我如何才能看到其中发生了什么?这可能是一个新手问题,但我很难找出如何查看特定函数的基本公式。

【问题讨论】:

标签: r function


【解决方案1】:

两个选项:

1) 正如 Nick Sabbe 所建议的那样,使用方法机制。请注意,这非常危险,因为它很大程度上取决于类、泛型和方法的实现方式以及它所在的面向对象框架(S3、S4、R5)。

# List all methods, S3 here
print(methods(rollmean))

  [1] rollmean.default rollmean.ts*     rollmean.zoo*   
  Non-visible functions are asterisked

# Get each of them
getAnywhere("rollmean.default")
getAnywhere("rollmean.ts")
getAnywhere("rollmean.zoo")

2) 直接找R源码。因为它是一个包,所以很容易:找到包的 .tar.gz 版本,查找“R”目录,你会找到源代码(如果有的话,还有开发者的 cmets)。动物园:http://cran.r-project.org/src/contrib/zoo_1.7-6.tar.gz

【讨论】:

    【解决方案2】:

    rollmean.default 可以解决问题(如help(UseMethod) 中所述):

    function (x, k, na.pad = FALSE, align = c("center", "left", "right"),
    ...)
    {
       x <- unclass(x)
       n <- length(x)
       y <- x[k:n] - x[c(1, 1:(n - k))]
       y[1] <- sum(x[1:k])
       rval <- cumsum(y)/k
       if (na.pad) {
           rval <- switch(match.arg(align), left = {
               c(rval, rep(NA, k - 1))
           }, center = {
               c(rep(NA, floor((k - 1)/2)), rval, rep(NA, ceiling((k -
                   1)/2)))
           }, right = {
               c(rep(NA, k - 1), rval)
           })
       }
       return(rval)
    }
    <environment: namespace:zoo>
    

    【讨论】:

    • rollmean.default 仅在对象的类不属于任何“Y”类以使rollmean.Y 存在时才“做事”?
    • 是的,@XuWang。由于人们期望不同对象的基本计算相同,fun.default 足以检查基本算法,但不适用于特定于对象的属性或错误。
    • 我不会依赖这种逻辑(或建议依赖它)。有些类有完全不同的方法,具体取决于功能。
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多