R виньетка не работает на внутренней функции пакета - PullRequest
1 голос
/ 24 мая 2019

Мы добавляем виньетку в наш пакет 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() виньетка строится нормально.

Минимальный пример расположен здесь .

1 Ответ

2 голосов
/ 07 июня 2019

Это потому, что R устанавливает LC_COLLATE на C при сборке пакетов, что часто , а не последовательность сортировки локали распространенных операционных систем, таких как те, которые вы упоминали в выпуске Github Yihui / knitr # 1719 . Поскольку вы использовали sort() в функции makeArray() в вашем минимальном примере, а 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 языком, следовательно, более устойчив к различным локалям.

...