有几种方法可以整合您的功能及其文档。
警告
因为您问如何整合和记录您现有的功能,所以我没有改进您的功能。你如何选择实现你的ss*()
功能取决于你。
力求与模块化编程的原则保持一致。您有责任确保您的每个功能都完成自己的工作,以便其他功能可以依赖它们。因此,您有责任从源头纠正任何错误。如果你这样做了,那么更正将从你的辅助函数“冒泡”到你的包的其余部分——你将“用一块石头杀死两个虫子”。
但是,就目前而言,您的代码存在一些明显的问题。
更正
更新
截至目前,根据我的第一个建议,该问题已被编辑以更正以下错误。此外,**
运算符已明智地替换为^
.
x
您的函数实际上是多余的正方形和立方体:
sss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x*x, .combine = "+") %dopar% {i**2}
# ^^ ^^^
# First time squaring. Second time squaring.
}
ssq <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x*x*x, .combine = "+") %dopar% {i**3}
# ^^^^ ^^^
# First time cubing. Second time cubing.
}
结果是sss()
实际使用了 4 次方(不是 2 次方),而ssq()
使用了 9 次方(不是 3 次方):
sss(x = c(1,2))
# [1] 17
ssq(x = c(1,2))
# [1] 513
您必须避免自行x
相乘
sss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**2}
# ^
# Corrected
}
ssq <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**3}
# ^
# Corrected
}
或删除**2
and **3
after%dopar% {i
sss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x*x, .combine = "+") %dopar% {i}
# ^
# Corrected
}
ssq <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x*x*x, .combine = "+") %dopar% {i}
# ^
# Corrected
}
得到你想要的输出:
sss(x = c(1,2))
# [1] 5
ssq(x = c(1,2))
# [1] 9
笔记
第一次更正更具可扩展性,因为
foreach::foreach(i = x, .combine = "+") %dopar% {i**10}
比打字短
foreach::foreach(i = x*x*x*x*x*x*x*x*x*x, .combine = "+") %dopar% {i}
对于更高的权力,如10
。
改进
坦率地说,对于这种简单的操作,您的代码非常复杂。如果你真的需要自定义函数——并且每个总和都有一个单独的函数——你可以用base
R 来做到这一点:
ss <- function(x){
sum(x)
}
sss <- function(x){
sum(x^2)
}
ssq <- function(x){
sum(x^3)
}
综合文件
根据...以及...记录 R 的R 文档,您可以在同一.Rd
文档中描述多个相关功能。
例子
考虑如何base::nrow()
与相关功能一起记录,例如ncol
:
描述
nrow
并ncol
返回 中存在的行数或列数x
。NCOL
并将NROW
向量视为 1 列矩阵,甚至是长度为 0 的向量,与as.matrix()
or兼容cbind()
,请参见示例。
用法
nrow(x)
ncol(x)
NCOL(x)
NROW(x)
论据
x
向量、数组、数据框或NULL
.
⋮</p>
应用
您可能希望在同一页面上同时记录 、 和所有ss()
内容sss()
。ssq()
这可以通过roxygen2
, 使用@describeIn
标签来完成
#' Obtain the sum.
# ⋮
#' @param x A vector of \code{numeric} values.
# ⋮
ss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i}
}
#' @describeIn ss Obtain the sum of squares.
sss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**2}
}
#' @describeIn ss Obtain the sum of cubes.
ssq <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**3}
}
或者通过使用@rdname
标签:
#' Obtain the sums of various powers: \code{ss} for original values, \code{sss} for their squares, and \code{ssq} for their cubes.
# ⋮
#' @param x A vector of \code{numeric} values.
# ⋮
ss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i}
}
#' @rdname ss
sss <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**2}
}
#' @rdname ss
ssq <- function(x){
`%dopar%` <- foreach::`%dopar%`
foreach::foreach(i = x, .combine = "+") %dopar% {i**3}
}
综合功能
您可能想要“整理”您的@export
ed 函数集。
使用现有功能
一方面,您可以创建一个新函数one_sum()
来包装现有函数;whereone_sum()
将是唯一 @export
的ed 函数:
#' Obtain the sum of any available power.
# ⋮
#' @param x A vector of \code{numeric} values.
#' @param mode \code{character}. The approach to use when summing: \code{"ss"} to sum the values themselves; \code{"sss"} to sum their squares; and \code{"ssq"} to sum their cubes.
# ⋮
#' @export
# ⋮
one_sum <- function(x, mode = c("ss", "sss", "ssq")) {
if(mode == "ss") {
ss(x)
} else if(mode == "sss") {
sss(x)
} else if(mode == "ssq") {
ssq(x)
} else {
stop("'mode' must be one of \"ss\", \"sss\", or \"ssq\".")
}
}
可扩展地
另一方面,您可以用单个函数替换所有内容any_sum()
,该函数具有另一个参数power
作为用于计算总和的幂:
#' Obtain the sum of any power.
# ⋮
#' @param x A vector of \code{numeric} values.
#' @param power \code{numeric}. The power to which the addends in \code{x} should be raised.
# ⋮
any_sum <- function(x, power) {
sum(x^power)
}
合并输出
实现您指定的特定输出
我想
ss sss qss
30 300 90000
仅包含软件包中的一个功能。
您可以利用现有功能或创建全新功能。
使用现有功能
一方面,您可以在新功能中利用现有three_sums()
功能;wherethree_sums()
将是唯一 @export
的ed 函数:
#' Obtain at once the sums of the three available powers.
# ⋮
#' @param x A vector of \code{numeric} values.
# ⋮
#' @export
three_sums <- function(x) {
setnames(c(ss(x), sss(x), ssq(x)), c("ss", "sss", "qss"))
}
可扩展地
另一方面,您可以用单个函数替换所有内容all_sums()
,该函数具有另一个参数powers
作为用于计算总和的不同幂。
#' Obtain at once the sums of all given powers.
# ⋮
#' @param x A vector of \code{numeric} values, to raise to powers and add.
#' @param powers A vector of \code{numeric} values: the powers to which the addends will be raised.
# ⋮
all_sums <- function(x, powers = 1:3) {
setNames(object = sapply(X = powers,
FUN = function(n){sum(x^n)},
simplify = TRUE),
nm = powers)
}
在这里,您可以指定要查看其总和的每个幂。例如,以下调用
all_sums(x = c(1, 2), powers = c(3, 4, 6, 9))
会给你立方(3
rd powers)、4
th powers、6
th powers 和9
th powers 的总和;全部用于向量中的值c(1, 2)
:
3 4 6 9
9 17 65 513
笔记
何时powers
未指定,则默认情况下
all_sums(x = c(1, 2))
将使用1
st、2
nd(平方)和3
rd(立方)幂
1 2 3
3 5 9
正如您在示例输出中所希望的那样。