【问题标题】:show source code for function in R [duplicate]显示R中函数的源代码[重复]
【发布时间】:2012-06-02 16:31:03
【问题描述】:

我可以使用lmclass::knn查看源代码,但是我没有显示princomp的代码。这个函数(或其他东西)是用 R 或其他字节码编写的吗? 我也无法使用来自How do I show the source code of an S4 function in a package? 的建议找到源代码。感谢您的帮助。

> princomp
function (x, ...) 
UseMethod("princomp")
<bytecode: 0x9490010>
<environment: namespace:stats>

【问题讨论】:

    标签: r open-source statistics machine-learning


    【解决方案1】:
    > stats:::princomp.default
    

    我在此找到它:view source code in R

    【讨论】:

      【解决方案2】:

      您必须使用该函数使用的相应方法来询问。试试这个:

      princomp # this is what you did without having a good enough answer
      methods(princomp) # Next step, ask for the method: 'princomp.default'
      getAnywhere('princomp.default') # this will show you the code
      

      您要查找的代码是:

      function (x, cor = FALSE, scores = TRUE, covmat = NULL, subset = rep(TRUE, 
          nrow(as.matrix(x))), ...) 
      {
          cl <- match.call()
          cl[[1L]] <- as.name("princomp")
          if (!missing(x) && !missing(covmat)) 
              warning("both 'x' and 'covmat' were supplied: 'x' will be ignored")
          z <- if (!missing(x)) 
              as.matrix(x)[subset, , drop = FALSE]
          if (is.list(covmat)) {
              if (any(is.na(match(c("cov", "n.obs"), names(covmat))))) 
                  stop("'covmat' is not a valid covariance list")
              cv <- covmat$cov
              n.obs <- covmat$n.obs
              cen <- covmat$center
          }
          else if (is.matrix(covmat)) {
              cv <- covmat
              n.obs <- NA
              cen <- NULL
          }
          else if (is.null(covmat)) {
              dn <- dim(z)
              if (dn[1L] < dn[2L]) 
                  stop("'princomp' can only be used with more units than variables")
              covmat <- cov.wt(z)
              n.obs <- covmat$n.obs
              cv <- covmat$cov * (1 - 1/n.obs)
              cen <- covmat$center
          }
          else stop("'covmat' is of unknown type")
          if (!is.numeric(cv)) 
              stop("PCA applies only to numerical variables")
          if (cor) {
              sds <- sqrt(diag(cv))
              if (any(sds == 0)) 
                  stop("cannot use cor=TRUE with a constant variable")
              cv <- cv/(sds %o% sds)
          }
          edc <- eigen(cv, symmetric = TRUE)
          ev <- edc$values
          if (any(neg <- ev < 0)) {
              if (any(ev[neg] < -9 * .Machine$double.eps * ev[1L])) 
                  stop("covariance matrix is not non-negative definite")
              else ev[neg] <- 0
          }
          cn <- paste("Comp.", 1L:ncol(cv), sep = "")
          names(ev) <- cn
          dimnames(edc$vectors) <- if (missing(x)) 
              list(dimnames(cv)[[2L]], cn)
          else list(dimnames(x)[[2L]], cn)
          sdev <- sqrt(ev)
          sc <- if (cor) 
              sds
          else rep(1, ncol(cv))
          names(sc) <- colnames(cv)
          scr <- if (scores && !missing(x) && !is.null(cen)) 
              scale(z, center = cen, scale = sc) %*% edc$vectors
          if (is.null(cen)) 
              cen <- rep(NA_real_, nrow(cv))
          edc <- list(sdev = sdev, loadings = structure(edc$vectors, 
              class = "loadings"), center = cen, scale = sc, n.obs = n.obs, 
              scores = scr, call = cl)
          class(edc) <- "princomp"
          edc
      }
      <environment: namespace:stats>
      

      我想这就是你所要求的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 2011-03-29
        • 2012-04-30
        • 2011-08-21
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多