Как я могу увидеть, что делает функция внутри функции? - PullRequest
2 голосов
/ 14 ноября 2011

Я хотел бы знать, какова формула для конкретной функции.Обычно, когда я набираю функцию без скобок, она возвращает формулу, поэтому, если я наберу 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 с загруженным пакетом zoo, он вернет следующее:

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

Я предполагаю, что что-то происходит в методе rollmean, но как мне узнать,там происходит?Это может быть вопрос новичка, но мне трудно понять, как увидеть основную формулу конкретной функции.

Ответы [ 2 ]

4 голосов
/ 14 ноября 2011

Два варианта:

1) Использование метода метода, как предлагает Ник Сабб. Заметьте, что это довольно сложно, так как это во многом зависит от того, как класс, универсальный объект и методы были реализованы и в какой объектно-ориентированной среде он был (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

3 голосов
/ 14 ноября 2011

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...