2013-10-28 12 views
7

Stavo guardando il source_code di cov in R, e corro in un paragrafo di codice che non capisco.Codice sorgente R. Chiamata funzione

La definizione matematica di covarianza goes qui.

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

L'aiuto manuale dice qualcosa sulla funzione .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. 

Mi chiedo dove posso trovare il codice sorgente di come calcolare la covarianza sia C++ o C o qualsiasi altra cosa.

Grazie.

risposta

12

.Call viene utilizzato per passare le variabili alle routine C. C_cov è una variabile (nel namespace stats che vedremo presto) che dice .Call dove trovare la routine che dovrebbe utilizzare per calcolare la covarianza.

Se si digita C_cov alla riga di comando, si otterrà

Error: object 'C_cov' not found 

Questo perché è nascosto da voi. Dovrai fare un piccolo lavoro da investigatore.

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

Questo ci dice che c'è una variabile denominata C_cov nello spazio stats nome (l'output potrebbe risultare leggermente diverso da questo). Proviamo a prenderlo.

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

Apparentemente C_cov non è per il consumo pubblico. Va tutto bene, siamo in grado di ottenere lo stesso:

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, ... 

Questo è l'informazioni che vogliamo. Ci dice il nome della routine e della libreria in cui si trova. Ora dobbiamo solo andare alla sorgente C e seguire il percorso: .../src/library/stats/src/cov.c

Problemi correlati