包装书写语言与个人用途有何不同?

时间:2011-09-22 02:44:07

标签: r package

我想知道所有包函数中的常见内容:

> sd
function (x, na.rm = FALSE) 
{
    if (is.matrix(x)) 
        apply(x, 2, sd, na.rm = na.rm)
    else if (is.vector(x)) 
        sqrt(var(x, na.rm = na.rm))
    else if (is.data.frame(x)) 
        sapply(x, sd, na.rm = na.rm)
    else sqrt(var(as.vector(x), na.rm = na.rm))
}
<environment: namespace:stats>

我们每次编写包时都应该提供环境吗?或者它是由功能自动定位的?

  > var
    function (x, y = NULL, na.rm = FALSE, use) 
    {
        if (missing(use)) 
            use <- if (na.rm) 
                "na.or.complete"
            else "everything"
        na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs", 
            "everything", "na.or.complete"))
        if (is.data.frame(x)) 
            x <- as.matrix(x)
        else stopifnot(is.atomic(x))
        if (is.data.frame(y)) 
            y <- as.matrix(y)
        else stopifnot(is.atomic(y))
        .Internal(cov(x, y, na.method, FALSE))
    }
    <environment: namespace:stats>

看起来我的功能更狡猾,精确计算...所以你能帮我解释一下包的功能与自用的不同吗? 谢谢;

1 个答案:

答案 0 :(得分:2)

您编写函数的方式与您的个人脚本文件相同,与您的软件包相同。 <environment: ...>行表示您正在查看的函数是具有命名空间的包的一部分。如果您在包中使用此功能,R将负责详细信息。

包命名空间和一般编写包是一个有点参与的过程,在Writing R Extensions Manual中有详细描述。您可能需要先阅读tutorial,然后在大致了解基础知识后阅读本手册。

官方套餐中的功能确实比我们的个人功能更加冗长。主要原因是公共包装,至少是广泛使用的包装,旨在容纳比任何一个典型用户可能需要的更广泛的输入和选项。因此,有更多的代码可以解释边缘情况和不常见的选项。如果函数使用C或Fortran代码,如上面的示例var,那么也会有一些神秘的语言来处理它。

因此,如果您想将个人功能编入包中,则无需更改任何有关编写个人功能的方法。但是,通过制作包的过程可能会激励您改进代码!