在不定义函数参数的情况下发布R包

时间:2019-05-20 23:26:43

标签: 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()的函数。

1 个答案:

答案 0 :(得分:0)

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