2011-11-14 25 views
1

我想知道特定函數的公式是什麼。通常,當我沒有括號輸入函數,它返回一個公式,所以如果我型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

你可能想嘗試'Methods'的一個開始?你需要的大部分信息都在那裏。 –

+0

'The R Inferno'的圓圈7也可能在這方面提供信息http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

+1

@NickSabbe:'?Methods'是針對S4類對象和動物園對象是S3類對象。最好以'?UseMethod'開頭(因爲它在函數體中),然後讀取'?methods'(它在'UseMethod'的See Also部分)。 –

回答

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

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> 
+0

如果對象的類沒有任何類「Y」,使得'rollmean.Y'存在,那麼只有「rollmean.default」不會執行「訣竅」嗎? –

+0

是的@徐王。因爲人們希望基本計算對於不同的對象是相同的,所以'fun.default'對於檢查基本算法是足夠的,而不是針對對象特定的屬性或者錯誤。 – Itamar

+0

我不會依賴那個邏輯(或者建議依賴它)。某些類具有完全不同的方法,具體取決於函數。 –