12

我在看 R 中 cov 的 source_code,遇到了一段我不太明白的代码。

协方差的数学定义在这里。

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 或其他的协方差的源代码。

谢谢。

4

1 回答 1

18

.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

这告诉我们C_covstats名称空间中有一个名为的变量(您的输出可能看起来与此略有不同)。让我们试着得到它。

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

于 2013-10-28T00:56:39.780 回答