R包中的mapply vs循环

mapply vs loop in R package

我编写了一个简单的函数,可以将旧日文文本转换为现代形式。我想 post 作为一个包,但我试图通过两种方式改进它。首先,使用 mapply 而不是循环有一个小的速度增益,但我无法获得我想要的结果。这是工作循环。

normalize <- function(doc)
{
  kanji_conversion <- data.frame("old" =c("學","勲"), "new" =c("学","勳"), stringsAsFactors = FALSE)
  for (i in 1:nrow(kanji_conversion))
 {doc <- gsub(kanji_conversion$old[i], kanji_conversion$new[i], doc)
  }
  return(doc)
} 

效果很好,在 https://github.com/histmr/Rekishi

但我对 mapply 版本的尝试 returns 不是单个字符串,而是匹配 kanji_conversion 的 nrow() 的向量,每个元素有一个变化

doc <- "學"
kanji_conversion <- data.frame("old" =c("學","勲"), "new" =c("学","勳"), stringsAsFactors = FALSE)
mapply(gsub, kanji_conversion$old, kanji_conversion$new, doc)
library(stringr)
mapply(str_replace_all, kanji_conversion$old, kanji_conversion$new, doc)

有没有办法像在循环中那样使用 mapply 迭代覆盖对象文档的单个版本?

其次,在函数的真实版本中,kanji_conversion 数据帧将为 2416 x 2。我是否应该像示例 2 x 2 df 那样在函数中包含更大的 df?或者它应该是一个外部文件?文件大小是否有 "best practice" 阈值?

你必须在提交时向 CRAN 解释长行,因此最好将它们硬包装起来。此外,如果您正在制作包,则无需在函数中构建数据框。这是一个不必要的开销。倒数第二个,stringi::stri_replace_all_fixed() 通过 patternreplacement 参数进行矢量化,因此您将获得一个支持 C++ 的超快速、编码友好的帮助程序来完成您想要做的事情。最后,normalize_kanji() 可能是一个更好的函数名称,可以避免命名冲突。

此外,您还会收到其他 CRAN 检查警告,具体而言:

Portable packages must use only ASCII characters in their R code, except perhaps in comments. Use \uxxxx escapes for other characters.

您需要就此与 CRAN 协商,将它们转换为 unicode 转义序列或将数据帧存储为 R 数据文件。

您会在 https://github.com/histmr/Rekishi/pull/1 中找到所有 ^^(除了针对 CRAN 检查警告的修复 ;-),因为翻译 table 太大而无法放在这里。

您以前的 normalize() 函数现在是:

normalize_kanji <- function(doc) {
  stri_replace_all_fixed(
    doc,
    kanji_conversion_table$old,
    kanji_conversion_table$new,
    vectorize_all = FALSE
  )
}

normalize_kanji("亞啞惡蘆鰺壓菴桉")

returns

## [1] "亜唖悪芦鯵圧庵案"

这不是可能的最佳速度衡量标准(输入采样越多样化越好,但这是特定转换的速度:

microbenchmark::microbenchmark(ƒ = normalize_kanji("亞啞惡蘆鰺壓菴桉"))
## Unit: microseconds
##  expr     min     lq     mean   median       uq     max neval
##     ƒ 188.362 190.61 202.7352 193.7235 201.9745 448.688   100

如果您想与您的方法进行比较。