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()
通过 pattern
和 replacement
参数进行矢量化,因此您将获得一个支持 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
如果您想与您的方法进行比较。
我编写了一个简单的函数,可以将旧日文文本转换为现代形式。我想 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()
通过 pattern
和 replacement
参数进行矢量化,因此您将获得一个支持 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
如果您想与您的方法进行比较。