Это потому, что 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
языком, следовательно, более устойчив к различным локалям.