我正在查看R中cov的source_code,并遇到一段我不太了解的代码段.
协方差的数学定义就在这里.
if (method == "pearson")
.Call(C_cov, x, y, na.method, method == "kendall")
else if ...
Run Code Online (Sandbox Code Playgroud)
帮助手册说明了.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.
Run Code Online (Sandbox Code Playgroud)
我想知道在哪里可以找到如何计算C++或C等协方差的源代码.
谢谢.
Mat*_*rde 16
.Call用于将变量传递给C例程.C_cov是一个变量(在stats我们很快就会看到的命名空间中),它告诉.Call在哪里找到它应该用来计算协方差的例程.
如果您C_cov在命令行输入,您将获得
Error: object 'C_cov' not found
Run Code Online (Sandbox Code Playgroud)
那是因为它对你隐藏了.你将不得不做一些侦探工作.
getAnywhere('C_cov')
# 4 differing objects matching ‘C_cov’ were found
# in the following places
# namespace:stats
# Use [] to view one of them
Run Code Online (Sandbox Code Playgroud)
这告诉我们C_cov在stats名称空间中有一个名为变量的变量(您的输出可能与此略有不同).我们试着去做吧.
stats::C_cov
# Error: 'C_cov' is not an exported object from 'namespace:stats'
Run Code Online (Sandbox Code Playgroud)
显然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, ...
Run Code Online (Sandbox Code Playgroud)
这就是我们想要的信息.它告诉我们它所在的例程和库的名称.现在我们只需要转到C源并按照跟踪:.../src/library/stats/src/cov.c