R Vignette 在内部包功能上失败
R Vignette Fails on Internal Package Function
我们正在向我们的 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。
这是因为 R 在构建包时将 LC_COLLATE
设置为 C
,这通常 而不是 常见操作系统区域设置的整理顺序,例如正如你在 Github issue yihui/knitr#1719. Because you used sort()
in the makeArray()
function in your minimal example 中提到的那样,sort()
depends on 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
语言环境,因此对不同的语言环境更加稳健。
我们正在向我们的 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。
这是因为 R 在构建包时将 LC_COLLATE
设置为 C
,这通常 而不是 常见操作系统区域设置的整理顺序,例如正如你在 Github issue yihui/knitr#1719. Because you used sort()
in the makeArray()
function in your minimal example 中提到的那样,sort()
depends on 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
语言环境,因此对不同的语言环境更加稳健。