как просмотреть исходный код c, загруженный в пакет R
Недавно я хотел узнать больше о пакете GWmodel. Я набралgwr.binomial.wt
на консоли в Rstudio:
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". я продолжал печататьgw_reg
в консоли Rstudio:
function (x, y, w, hatmatrix, focus)
{
.Call("GWmodel_gw_reg", PACKAGE = "GWmodel", x, y, w, hatmatrix,
focus)
}
Я обнаружил, что эта функция мало что говорит мне о том, как она работает. Как я понимаю,.call()
означает, что функция реализована в коде C/C++. Итак, как мне посмотреть на эту функцию более подробно? Или как мне посмотреть код C, который реализует эту функцию?
1 ответ
Код 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++.