R小插图无法使用内部包装功能

时间:2019-05-24 19:21:39

标签: r devtools r-package roxygen2 vignette

我们正在将小插图添加到R包中。使用roxygen2记录包裹时,小插图会打断,并给出错误信息

Error in tMatrix[i, j, ] <- testVec : 
  number of items to replace is not a multiple of replacement length

但是,使用devtools::document()devtools::build_vignettes(),小插图可以很好地构建。

位于here的最小示例。

1 个答案:

答案 0 :(得分:2)

这是因为R在构建程序包时将LC_COLLATE设置为C,这通常不是常见操作系统(如您在第2部分中提到的)的语言环境的整理顺序。 Github问题yihui/knitr#1719。由于在最小示例中makeArray()函数中的you used sort()并且sort()依赖于LC_COLLATE,因此您将在R控制台中获得不同的结果(其中LC_COLLATE是通常不是C)和R CMD build中的内容。重现该错误:

# Copied from https://github.com/GilChrist19/vignetteExample/blob/8973dbc/vignetteExample/R/array.R#L8-L45
makeArray <- function(names = c("AA", "Aa", "aa")){


  size <- length(names)
  tMatrix <- array(data=0, dim=c(size, size, size), dimnames=list(names, names, names))
  testVec <- setNames(object = numeric(size), nm = names)

  # fill up the array
  for (i in names)
  {
    for (j in names)
    {

      j_name <- strsplit(j, split='')[[1]]
      i_name <- strsplit(i, split='')[[1]]
      ij_prod <- as.vector( outer(j_name, i_name, paste0, sep='') )

      # sort
      ij_prod <- vapply( strsplit(ij_prod, split=''),
                           function(x) {paste0(sort(x, decreasing=TRUE), collapse='')},
                           FUN.VALUE = character(1))

      for (k in ij_prod)
      {
        testVec[k] <- testVec[k]+5
      }

      # testVec[] <- testVec/sum(testVec)

      tMatrix[i,j, ] <- testVec

      testVec[] <- 0
    }
  }


  return(tMatrix)
}


Sys.setlocale('LC_COLLATE', 'C')
makeArray()

由于我不熟悉您的功能,因此我将由您决定如何处理sort()。我可以给出的一个提示是,sort(method = 'radix')始终遵循C区域设置,因此对不同的区域设置更加健壮。