我正在尝试理解R包ucminf调用的C代码。以下代码来自https://cran.r-project.org/src/contrib/ucminf_1.1-4.tar.gz处的文件interface.c:
#include <R.h>
#include <Rinternals.h> //R internal structures
#include <R_ext/RS.h> //F77_CALL etc.
// Declare FORTRAN routine for use in C
extern void F77_NAME(ucminf)(int*, double[], double*, double[],
int*,double[],int*,int*,int*,double[],SEXP);
/*-------------------------------------------------------------------------------
Define C functions that calls user defined function in R
*/
void installPar(int nn, double x[], SEXP rho) {
int i;
SEXP PAR = findVarInFrame(rho, install(".x"));
double *xpt = REAL(PAR);
if (LENGTH(PAR) != nn)
error("Dimension mismatch, length(.x) = %d != n = $d", LENGTH(PAR), nn);
for (i = 0; i < nn; i++) xpt[i] = x[i] ;
}
rho
是在R中创建的环境,它包含向量.x
。我最好的猜测是SEXP PAR = findVarInFrame(rho, install(".x"));
行将PAR
设置为.x
,但install()
命令的作用是什么?
这是一个如此简单的问题,我很惊讶我在网上找不到答案 - 搜索“安装c语法”发现了很多关于如何安装编译器的信息,但我找不到任何关于命令的信息。任何有关关键字的建议都会使我的搜索更有效。
答案 0 :(得分:4)
此代码是我认为的R扩展的一部分,因此这里使用install
是对Writing Extension的R C API的函数调用。这样做是在当前符号表中创建符号.x
(或返回对现有.x
符号的引用)。链接文档确实表明如果符号已经存在,使用install
是无害的,并且如果这是您真正想要做的事情,那么查找符号是一种好方法。