显示R中函数的源代码[重复]

Posted

技术标签:

【中文标题】显示R中函数的源代码[重复]【英文标题】:show source code for function in R [duplicate] 【发布时间】: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>

【问题讨论】:

【参考方案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>

我想这就是你所要求的。

【讨论】:

以上是关于显示R中函数的源代码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

R中带有重复命令的Switch语句

R语言使用Repeat函数多次执行代码块内的语句,实现循环执行任务的功能:repeat没有提供任何检查条件,所以编码者必须给出退出重复循环的条件(一般使用if和break)

析构函数问题+列表显示[重复]

将聚合函数从 R 转换为 python [重复]

r 代码段显示了自定义的HTML表函数和示例。我的下一步是将此HTML表复制并粘贴到excel文件中,

r 代码段显示了自定义的HTML表函数和示例。我的下一步是将此HTML表复制并粘贴到excel文件中,