r - 发布 R 包而不定义函数参数
问题描述
我目前正在用他们的代码为某人制作一个包。在 R 上运行 cmdcheck 以将包上传到 CRAN 时,我一直遇到问题:缺少参数“ftab”,没有默认值。有没有办法让支票忽略这一点?
我尝试了一些方法,例如设置 ftab = NULL,我设置了 ftab = ftab<-rbind(c(20,10,20),c(15,15,20)) 和 ftab = NA。
chi.stat<-function(ftab)
{
tot<-sum(ftab);
expv<-outer(rowSums(ftab)/tot, colSums(ftab)/tot, '*')*tot;
signal<-(colMeans(expv)<eps)*(1:dim(ftab)[2]);
indx<-setdiff(signal,0);
ftemp<-((ftab-expv)^2/expv)
chi.val<-ifelse(length(indx)==0, sum(ftemp), sum(ftemp[,-indx]));
return(chi.val);
}
编辑:问题可能出在此处吗?
#' chi.stat function
#'
#' This function... (description here)
#' @param ftab (argument here)
#' @return chi.val (return value)
#' @export
#' @examples
#' chi.stat()
我也尝试在示例中输入默认参数,哪种修复了无默认问题但会产生一些不同的问题。此外,我觉得它似乎不需要默认参数,但我不确定。如果需要,我可以发布调用 chi.stat() 的其他函数。
解决方案
这是由于你的@examples
部分。将定义更改为:
#' chi.stat function
#'
#' This function... (description here)
#' @param ftab (argument here)
#' @param eps numeric, a tolerance factor; default 1e-9
#' @return chi.val (return value)
#' @export
#' @examples
#' \dontrun{
#' chi.stat()
#' }
chi.stat<-function(ftab, eps = 1e-9)
{
tot<-sum(ftab);
expv<-outer(rowSums(ftab)/tot, colSums(ftab)/tot, '*')*tot;
signal<-(colMeans(expv)<eps)*(1:dim(ftab)[2]);
indx<-setdiff(signal,0);
ftemp<-((ftab-expv)^2/expv)
chi.val<-ifelse(length(indx)==0, sum(ftemp), sum(ftemp[,-indx]));
return(chi.val);
}
防止 cmdcheck 尝试运行示例部分中的所有代码。(我在函数参数中添加了一个默认值eps
来解决另一个问题。如果您愿意,可以将其定义为函数内常量。)
更好ftab
的是,在该部分中手动构建一个适当的参数@examples
(不要使用\dontuse
)。这是一种 CI 测试,每次您 cmdcheck 和/或构建包时,它都会运行所有代码并抱怨错误。
#' chi.stat function
#'
#' This function... (description here)
#' @param ftab (argument here)
#' @param eps numeric, a tolerance factor; default 1e-9
#' @return chi.val (return value)
#' @export
#' @examples
#' m <- matrix(1:4, nrow = 2)
#' chi.stat(m)
#' # [1] 0.07936508
是否在@examples
部分中包含输出是个人喜好问题。如果您想进一步进行 CI 测试,请执行以下操作
#' @examples
#' m <- matrix(1:4, nrow = 2)
#' ret <- chi.stat(m)
#' stopifnot(abs(ret - 0.07936508) < 1e-9)
它可能不会取代完整的测试,但如果你没有正式的单元测试(可能通过testthat
在包的./tests/testthat/
文件夹中),那么这总比没有好。
注意:根据您的功能要求确保 0.079 数字实际上是正确的。也就是说,如果您正在实施一些已知的流程/算法,请采用先前已知的或手动计算/验证的输入和输出。
推荐阅读
- forms - 未收到 Formsubmit.co 激活电子邮件
- javascript - 为什么 navigator.mediaDevices.enumerateDevices() 返回不同的值?
- javascript - 无法读取 discord.js 中未定义的属性“缓存”
- ios - 如何在一个集合视图中获取多个集合单元而不创建 XIB
- laravel - laravel 图像验证总是失败
- typescript - 尝试返回地图时“没有重载匹配此调用”
- zoho - Zoho creator 与 zoho 图书的集成
- javascript - 如何在视频中制作多个缓冲区?(互动视频JAVASCRIPT)
- python - 使用 python 3.6 Tkinter 和 cx_Freeze 或 PyInstaller(使用 dlib)创建可执行文件,但由于 dlib,DLL 无法加载
- java - Thymeleaf with mule 无法解析资源下的 HTML 路径