2011-09-22 29 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> 

如果我們每次提供的環境,我們寫了一個包?或者由功能自動定位的位置決定?

> var 
    function (x, y = NULL, na.rm = FALSE, use) 
    { 
     if (missing(use)) 
      use <- if (na.rm) 
       "na.or.complete" 
      else "everything" 
     na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs", 
      "everything", "na.or.complete")) 
     if (is.data.frame(x)) 
      x <- as.matrix(x) 
     else stopifnot(is.atomic(x)) 
     if (is.data.frame(y)) 
      y <- as.matrix(y) 
     else stopifnot(is.atomic(y)) 
     .Internal(cov(x, y, na.method, FALSE)) 
    } 
    <environment: namespace:stats> 

看起來我說,功能更verbious,即精確的計算...所以你能不能幫我解釋功能是如何爲一個包比自己用的有什麼不同? 謝謝;

+4

你在問什麼不清楚...... –

回答

2

對於您的個人腳本文件,您編寫函數的方式與您的包的方式相同。 <environment: ...>行表示您正在查看的函數是包含命名空間的包的一部分。如果你在你的軟件包中使用這個特性,R會處理細節。

軟件包名稱空間和一般寫入軟件包是一個有點牽扯的過程,在Writing R Extensions Manual中有詳細描述。您可能首先要閱讀tutorial,並且在對基本知識有一個大致的瞭解之後閱讀手冊。

官方軟件包中的功能通常比我們的個人功能更冗長。主要原因是公共軟件包(至少是廣泛使用的軟件包)旨在提供比任何一個典型用戶可能需要的更廣泛的輸入和選項。所以有更多的代碼來解釋邊緣情況和不常見的選擇。如果函數使用C或Fortran代碼(如上面的示例var),那麼也會有一些神祕的語言來處理這個問題。

因此,如果要將它們組裝成包,則無需更改任何有關編寫個人功能的方式。但是,通過製作軟件包的過程可能會激勵您改進代碼!