首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查看加载到R包中的c#源代码

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

Stack Overflow用户
提问于 2022-07-29 09:41:17
回答 1查看 33关注 0票数 0

最近,我想知道更多关于GWmodel包的详细信息,我在控制台上输入了gwr.binomial.wt

代码语言:javascript
复制
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

代码语言:javascript
复制
function (x, y, w, hatmatrix, focus) 
{
  .Call("GWmodel_gw_reg", PACKAGE = "GWmodel", x, y, w, hatmatrix, 
        focus)
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-29 10:58:15

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

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

代码语言:javascript
复制
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++函数的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73164667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档