255-如何解决R包检查中出现的non-ASCII characters问题

刘小泽写于2022.05.21

前言

最近收到CRAN的提醒,说是R包出现了一些非ASCII字符

因为没有遇到过,所以直接搜索:

https://stackoverflow.com/questions/29043932/how-to-handle-example-data-in-r-package-that-has-utf-8-marked-strings/

一般这种情况都是因为R包中的data 内置数据集出现了非ASCII字符

其中的答案意思都是用函数进行转换,其中我们可以用 stringi::stri_enc_toascii()

问题的关键

我们知道了怎么处理,那么需要处理哪些数据呢?

这里可以采用stringi::stri_enc_isascii 进行判断

如果你不止一个数据集,那么强烈建议循环处理

举个例子:

files = list.files('./data',recursive = T)
sapply(files, function(f){
  load(paste0('./data/',f))
  stringi::stri_enc_isascii(f)
})
# a.rda             b.rda             c.rda              d.rda 
# TRUE              TRUE              FALSE              TRUE 
# e.rda            f.rda             g.rda 
# TRUE              TRUE              TRUE 

这里发现c这个数据集有问题,那么单独拿出来看看

# 如果要循环,套一个sapply即可
f =  "c.rda" 
apply(eval(parse(text=gsub('.rda','',f))), 2, function(x){
    length(which(!stringi::stri_enc_isascii(x)))
  })

# 									c.rda
# A                   15
# B                   108
# C                   0
# D                   0

这样加起来正好是CRAN告知的123个字符

解决问题

最后只需要把A、B两列转换一下:

c$A <- stringi::stri_enc_toascii(c$A)
c$B <- stringi::stri_enc_toascii(c$B)

最后再次运行上一步👆代码判断一下,看看是否正确了

提交前别忘了检查

写完R包一定要先检查各个平台的适用性,等到CRAN或者Bioconductor催你就不好了

rhub就是这样一个非常方便的包

首先看看它支持的检查平台
rhub::platforms() %>% as.data.frame() %>% dplyr::pull(name)
 [1] "debian-clang-devel"            "debian-gcc-devel"             
 [3] "debian-gcc-devel-nold"         "debian-gcc-patched"           
 [5] "debian-gcc-release"            "fedora-clang-devel"           
 [7] "fedora-gcc-devel"              "linux-x86_64-centos-epel"     
 [9] "linux-x86_64-rocker-gcc-san"   "macos-highsierra-release"     
[11] "macos-highsierra-release-cran" "macos-m1-bigsur-release"      
[13] "solaris-x86-patched"           "solaris-x86-patched-ods"      
[15] "ubuntu-gcc-devel"              "ubuntu-gcc-release"           
[17] "ubuntu-rchk"                   "windows-x86_64-devel"         
[19] "windows-x86_64-oldrel"         "windows-x86_64-patched"       
[21] "windows-x86_64-release"  
然后一句命令检查
check(platform = 'windows-x86_64-devel')

可以看到这里我的这个问题解决了

最后,如果你想更省事的话,那就用循环吧,将所有平台都过一遍。。。

Yunze Liu
Yunze Liu
Bioinformatics Sharer

Co-founder of Bioinfoplanet(生信星球)

Next
Previous

Related