R.Internalまたは.Primitive関数のソースコードを確認するにはどうすればよいですか?


81

これらはどちらもpnorm関数のソースコードを示していません。

stats:::pnorm
getAnywhere(pnorm)  

のソースコードを確認するにはどうすればよいpnormですか?

sum
 (..., na.rm = FALSE)  .Primitive("sum")
.Primitive("sum")
function (..., na.rm = FALSE)  .Primitive("sum")
methods(sum)
no methods were found

そして、どうすればsum関数のソースコードを見ることができますか?

回答:


96

のRソースコードpnormは次のとおりです。

function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) 
.Call(C_pnorm, q, mean, sd, lower.tail, log.p)

したがって、技術的に言えば、「pnorm」と入力するとソースコード表示されます。ただし、より便利なのは、の内臓がpnormCでコーディングされているため、Rのソースコードを表示する前の質問のアドバイスは、周辺的にのみ役立ちます(ほとんどは、名前空間などに隠された関数に集中しています)。

Rニュース(p。43)のUwe Liggesの記事は、一般的な参考資料として適しています。その文書から:

Rソースコードを見ると、次の関数のいずれかが表示されることがあります:.C()、. Call()、. Fortran()、. External()、または.Internal()と.Primitive()。これらの関数は、共有オブジェクト、静的ライブラリ、ダイナミックリンクライブラリなどのコンパイル済みコードのエントリポイントを呼び出しています。したがって、コードを完全に理解する必要がある場合は、コンパイルされたコードのソースを調べる必要があります。...最初のステップは、呼び出し元のR関数が.Primitive()または.Internal()の場合、ファイル '$ R HOME / src / main /names.c'のエントリポイントを検索することです。これは、次の例で「単純な」R関数sum()を実装するコードに対して実行されます。

((sum)について尋ねた正確な関数がLiggesの記事でカバーされているため、強調が追加されました。)

コードをどれだけ真剣に掘り下げたいかによっては、Liggesが提案するように、ソースコードをダウンロードして解凍する価値があるかもしれません(たとえば、grepソースコードを検索するなどのコマンドラインツールを使用できます)。よりカジュアルな検査のために、RSubversionサーバーまたはWinstonChangのgithubミラーを介してオンラインでソースを表示できます(ここのリンクは特にへのリンクですsrc/nmath/pnorm.c)。(見るsrc/nmath/pnorm.cのに適切な場所を推測するには、Rソースコードの構造にある程度精通している必要があります。)

meansum両方がsummary.cに実装されています。


1
とは別のカテゴリにありますpnormmean.defaultRコードを試してみてください。Cコードはgithub.com/wch/r-source/blob/trunk/src/main/summary.cを試してください。そして、上にリンクされているUwe Liggesの記事を読んでください!
ベンボルカー2012

1
この答えをフォローアップするためだけに、CまたはFortranの正確な関数名にも注意する必要があるかもしれません。例:stlこの行を呼び出す、のソースを検索しようとしました:z <- .Fortran(C_stl, x, n, as.integer(period), as.integer(s.window)。そのため、上記のリンク先のGithubミラーをキーワードで検索C_stlしても無駄でした。しかし、私が検索stlすると、stl.f私が見つけたいものであるというファイルがあります。要点は、.cまたは.fファイル名が、呼び出されている関数名と完全に同じではない可能性があることです。
yuqli 2018

35

この投稿は2年以上前のものですが、この質問を閲覧している一部のユーザーにとっては役立つかもしれないと思いました。

私は基本的に、この他の同様の質問に対する私の答えをコピーしているだけので、Cソースファイルを調べたい一部のRユーザーにとって役立つかもしれません。

  1. まず、prirを使用するshow_c_sourceと、Cソースファイル内の関連するコードをGitHubで検索する関数を使用できます。.Internal関数と.Primitive関数で機能します。

    body(match.call)
    
    # .Internal(match.call(definition, call, expand.dots))
    
    pryr::show_c_source(.Internal(match.call(definition, call, expand.dots)))
    

    どちらに移動します。このページ、上映unique.c関数が含まdo_matchcallを

  2. このタブ区切りファイルをまとめ、ファイルを基に、names.cファイル内検索を使用してソースコードの場所を特定しました。プラットフォーム固有のファイルを持つ関数と、関連するソースコードを含むファイルが複数ある関数がいくつかあります。しかし、残りの部分については、少なくとも現在のバージョン(3.1.2)では、マッピングはかなり確立されています。


のCコードを見つけようとしたときにprirが機能しない systempryr::show_c_source(.Internal(system(x)))、私が得たError: Could not find entry for system
zhanxw

7
> methods(mean)
[1] mean.data.frame mean.Date       mean.default    mean.difftime   mean.IDate*    
[6] mean.POSIXct    mean.POSIXlt    mean.yearmon*   mean.yearqtr*  

   Non-visible functions are asterisked
> mean.default
function (x, trim = 0, na.rm = FALSE, ...) 
{
    if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
        warning("argument is not numeric or logical: returning NA")
        return(NA_real_)
    }
    if (na.rm) 
        x <- x[!is.na(x)]
    if (!is.numeric(trim) || length(trim) != 1L) 
        stop("'trim' must be numeric of length one")
    n <- length(x)
    if (trim > 0 && n) {
        if (is.complex(x)) 
            stop("trimmed means are not defined for complex data")
        if (any(is.na(x))) 
            return(NA_real_)
        if (trim >= 0.5) 
            return(stats::median(x, na.rm = FALSE))
        lo <- floor(n * trim) + 1
        hi <- n + 1 - lo
        x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi]
    }
    .Internal(mean(x))
}
<bytecode: 0x155ef58>
<environment: namespace:base>

これはOPの元の質問(についてpnorm)に答えていないようですが、以下のmean-についてのコメントです。これは下部のCコードにも当てはまることに注意してください(以下の私のコメントを参照)。
ベンボルカー2012

2
確かに。そして、「正解」はあなたが以前に与えたものです... RNewsのUweLiggesの記事を読んでください。
IRTFM 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.