как просмотреть исходный код 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++.

Другие вопросы по тегам