如何查看已加载到R包中的c源代码



最近,我想了解有关GWmodel包的更多详细信息。我在Rstudio:的控制台上键入了gwr.binomial.wt

function (y, x, bw, W.mat, verbose = T) 
{
tol = 1e-05
maxiter = 20
dp.n <- nrow(x)
var.n <- ncol(x)
betas <- matrix(nrow = dp.n, ncol = var.n)
betas1 <- betas
S <- matrix(nrow = dp.n, ncol = dp.n)
n = rep(1, length(y))
it.count <- 0
llik <- 0
mu <- 0.5
nu <- 0
if (verbose) 
cat(" Iteration    Log-Likelihood:(With bandwidth: ", 
bw, ")n=========================n")
wt2 <- rep(1, dp.n)
repeat {
y.adj <- nu + (y - n * mu)/(n * mu * (1 - mu))
for (i in 1:dp.n) {
W.i <- W.mat[, i]
gwsi <- gw_reg(x, y.adj, W.i * wt2, FALSE, i)
betas1[i, ] <- gwsi[[1]]
}
nu <- gw_fitted(x, betas1)
mu <- exp(nu)/(1 + exp(nu))
old.llik <- llik
llik <- sum(lchoose(n, y) + (n - y) * log(1 - mu/n) + 
y * log(mu/n))
if (is.na(llik)) 
llik <- old.llik
if (verbose) 
cat(paste("   ", formatC(it.count, digits = 4, width = 4), 
"    ", formatC(llik, digits = 4, width = 7), 
"n"))
if (abs((old.llik - llik)/llik) < tol) 
break
wt2 <- n * mu * (1 - mu)
it.count <- it.count + 1
if (it.count == maxiter) 
break
}
res <- list(wt2, llik, y.adj)
res
}

然后,我不太理解";gw_ reg";作用我继续在Rstudio:的控制台中键入gw_reg

function (x, y, w, hatmatrix, focus) 
{
.Call("GWmodel_gw_reg", PACKAGE = "GWmodel", x, y, w, hatmatrix, 
focus)
}

我发现这个函数并没有告诉我它是如何工作的。据我所知,.call()意味着该函数是用C/C++代码实现的。那么,我该如何更详细地看待这个函数呢?或者我该如何看待实现该函数的C代码?

函数的C++代码可以在包的源文件的src/GWmodel.cpp中找到。实际的C++函数也称为gw_reg,但在Rcpp导出时被重命名。

你可以在Github上查看这个函数,看看它在上下文中是如何工作的,但这个函数本身就是

List gw_reg(mat x, vec y, vec w, bool hatmatrix, int focus)
{
mat wspan(1, x.n_cols, fill::ones);
mat xtw = trans(x % (w * wspan));
mat xtwx = xtw * x;
mat xtwy = trans(x) * (w % y);
mat xtwx_inv = inv(xtwx);
vec beta = xtwx_inv * xtwy;
if (hatmatrix)
{
mat ci = xtwx_inv * xtw;
mat s_ri = x.row(focus - 1) * ci;
return List::create(
Named("beta") = beta,
Named("S_ri") = s_ri,
Named("Ci") = ci);
}
else
{
return List::create(
Named("beta") = beta);
}
}

我发现追踪此类源代码的最简单方法是在Github上找到包,并使用搜索工具查找C++函数的名称。

最新更新