我想知道所有包函数中的常见内容:
> 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>
看起来我的功能更狡猾,精确计算...所以你能帮我解释一下包的功能与自用的不同吗? 谢谢;
答案 0 :(得分:2)
您编写函数的方式与您的个人脚本文件相同,与您的软件包相同。 <environment: ...>
行表示您正在查看的函数是具有命名空间的包的一部分。如果您在包中使用此功能,R将负责详细信息。
包命名空间和一般编写包是一个有点参与的过程,在Writing R Extensions Manual中有详细描述。您可能需要先阅读tutorial,然后在大致了解基础知识后阅读本手册。
官方套餐中的功能确实比我们的个人功能更加冗长。主要原因是公共包装,至少是广泛使用的包装,旨在容纳比任何一个典型用户可能需要的更广泛的输入和选项。因此,有更多的代码可以解释边缘情况和不常见的选项。如果函数使用C或Fortran代码,如上面的示例var
,那么也会有一些神秘的语言来处理它。
因此,如果您想将个人功能编入包中,则无需更改任何有关编写个人功能的方法。但是,通过制作包的过程可能会激励您改进代码!