首页 > 解决方案 > 发布 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() 的其他函数。

标签: r

解决方案


这是由于你的@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 数字实际上是正确的。也就是说,如果您正在实施一些已知的流程/算法,请采用先前已知的或手动计算/验证的输入和输出。


推荐阅读