2013-10-28 44 views
7

我正在查看R中cov的source_code,並運行到我不太明白的一段代碼中。R源代碼。調用函數

這裏的協方差的數學定義爲goes

if (method == "pearson") 
    .Call(C_cov, x, y, na.method, method == "kendall") 
else if ... 

幫助手冊說一些關於.CALL功能:

CallExternal {base} R Documentation 
Modern Interfaces to C/C++ code 
Description 
Functions to pass R objects to compiled C/C++ code that has been loaded into R. 

我不知道我在哪裏可以找到如何計算方差或者C++或C或任何的源代碼。

謝謝。

回答

12

.Call用於將變量傳遞給C例程。 C_cov是一個變量(在我們很快會看到的stats名稱空間中)告訴.Call在哪裏找到它應該用來計算協方差的例程。

如果你在命令行中鍵入C_cov,你會得到

Error: object 'C_cov' not found 

那是因爲它是從你隱藏。你必須做一些小小的偵探工作。

getAnywhere('C_cov') 
# 4 differing objects matching ‘C_cov’ were found 
# in the following places 
# namespace:stats 
# Use [] to view one of them 

這告訴我們,有一個在stats命名空間命名C_cov變量(您的輸出可能是從這個略有不同)。讓我們嘗試獲取它。

stats::C_cov 
# Error: 'C_cov' is not an exported object from 'namespace:stats' 

顯然C_cov不適合公衆消費。沒關係,我們可以得到它:

stats:::C_cov # use three colons to get unexported variables. 
# $name 
# [1] "cov" 
# # blah, blah, blah ... 
# $dll 
# DLL name: stats 
# Filename: C:/Program Files/R/R-3.0.1/library/stats/libs/x64/stats.dll 
# Dynamic lookup: FALSE 
# # blah, blah, ... 

這就是我們想要的信息。它告訴我們它的例程和庫的名稱。現在,我們只需要轉到C源並遵循以下步驟:.../src/library/stats/src/cov.c