r語言中怎樣查看函數源代碼
在r中看函數源代碼: 在R中,代碼可以分為如下幾個級別: 首先,是你輸入了函數對象名稱,你可以直接看到代碼的,如要獲得函數對象fivenum的代碼,就只需要在Console中鍵入函數對象名稱fivenum就可以得到如下結果: function (x, * = TRUE) { xna <- *(x) if (*) x <- x[!xna] else if (any(xna)) return(*(NA, 5)) x <- sort(x) n <- length(x) if (n == 0) *(NA, 5) else { n4 <- floor((n + 3)/2)/2 d <- c(1, n4, (n + 1)/2, n + 1 - n4, n) 0.5 * (x[floor(d)] + x[ceiling(d)]) } }
其次,我們在輸入mean這類函數名次的時候,會出現如下結果: function (x, 。) UseMethod("mean")
這個時候我們可以先試一試methods(mean),利用methods函數看看mean這個函數都有哪些類型的,我們得到的結果如下: [1] * * *t *me *t *t 其實對此可以有一個簡單的理解,雖然不夠精確。因為在R中,mean函數可以求得屬于不同類型對象的平均值,而不同類型對象平均值的求法還是有一些小小差 異的,比如說求一個向量的平均值和求一個數據框的平均值就有所差異,就要編寫多個mean函數,然后“封”起來,以一個統一的mean出現,方便我們使 用。
這正好也反映了R有一種類似泛型編程語言的性質。 既然我們已經知道mean中還有這么多種類,我們可以輸入*t試一試就可以得到: function (x, trim = 0, * = FALSE, 。
) { if (!*c(x) && !*x(x) && !*l(x)) { warning("argument is not numeric or logical: returning NA") return(*c(NA)) } if (*) x <- x[!*(x)] trim <- trim[1] n <- length(x) if (trim > 0 && n > 0) { if (*x(x)) stop("trimmed means are not defined for complex data") if (trim >= 0.5) return(stats::median(x, * = FALSE)) lo <- floor(n * trim) + 1 hi <- n + 1 - lo x <- *(x, partial = unique(c(lo, hi)))[lo:hi] n <- hi - lo + 1 } .Internal(mean(x)) }
這種形式的函數在R中一般作為默認的函數表示。 第三,這是一種特殊的情況,有人認為應該和第二種是一類,但是我還是要提出來單獨歸類。
在這種情況也和第二種的原因有些類似,但并不是完全一致。 也許我們大家都很熟悉plot函數了吧,輸入函數名plot的時候,我們會得到如下結果: function (x, y, 。
) { if (*(attr(x, "class")) && *on(x)) { nms <- names(list(。)) if (missing(y)) y <- { if (!"from" %in% nms) 0 else if (!"to" %in% nms) 1 else if (!"xlim" %in% nms) NULL } if ("ylab" %in% nms) *on(x, y, 。
) else *on(x, y, ylab = paste(deparse(substitute(x)), "(x)"), 。) } else UseMethod("plot") }
這個時候,我們也使用methods(plot)來看看,得到如下結果: ** ** ** ** *t *gram* *y * ** *a* ** *ram* *nters* ** * *ish* * *t* *t* ** ** *mp* ** * *ncy * *n ** ** * *el* *SD 不看不知道,一看嚇一跳,還以為我們輸入plot的輸出就是函數本身,結果也許不是如此。可能有人已經理解了,其實最后的UseMethod函數實在默認的調用*t函數,趕快再看看*t函數吧,發現它再調用*函數,再看看*函數,再*函數中調用了一個.Internal(*(xy, type, pch, lty, col, bg, cex, lwd, 。
))函數,也許這就是真正起作用的函數了吧。思路基本上就是如此了,是否這個時候您可以獲得一些閱讀查找R函數內容的樂趣。
除了直接輸入*t形式外,還可以使用getS3method(FUN,"default")來獲得代碼。這樣就解決了絕大多數函數代碼查看的工作了。
在第二種情況種,我們說了一般可以通過*t獲得想要的結果。但是只有稱為generic的函數才有這種“特權”。
而lm等則沒有,不過我們也可以嘗試使用methods(lm)來看看結果如何,發現: [1] * * *nce * * Warning message: function 'lm' appears not to be generic in: methods(lm) 出現了警告信息,表示說lm不是泛型函數,但是。