如何查看函数内部函数的作用?

时间:2011-11-14 12:35:10

标签: r function

我想知道特定功能的公式是什么。通常当我键入没有括号的函数时,它会返回一个公式,所以如果我输入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>

哪个好。但是如果我在加载动物园包时键入rollmean,则返回:

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

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

2 个答案:

答案 0 :(得分:4)

两个选项:

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'目录,你会找到源代码(如果有的话,有开发者的评论)。对于动物园:http://cran.r-project.org/src/contrib/zoo_1.7-6.tar.gz

答案 1 :(得分:3)

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>