如何从 r 中的源代码导入函数并保留希伯来字符

How can I import a function from source in r and keep hebrew characters

我在使用 source() 从文件加载函数时遇到 R 语言编码问题。

该函数(定义如下)采用希伯来语文本文件并搜索特定单词。如果我将函数定义为 RStudio 脚本的一部分,一切都会按预期进行。但是,如果我将该函数保存到磁盘,并使用 source 加载它,希伯来文搜索字符串将转换为看似乱码的内容,并且搜索无法找到搜索字符串。搜索字符串肯定存在于文本文件中,并且以希伯来语正确加载。

例如,我试过用 utf8::as_utf8("מסכת") 包围希伯来语,但没有效果。

这是函数代码和库:

library(stringr)
library(dplyr)
library(rvest)

test_fn <- function(x) {
    raw_text <- read_html(x)
    masechet <- raw_text %>% html_nodes("h2") %>%
        head(1) %>% html_text() %>%
        str_remove("מסכת") %>%
        str_remove("פרק א") %>% str_trim
    message(masechet)
}

明确一点:如果它是 RStudio window 的一部分,则一切正常。但是如果我这样加载它:

assemble <- source("test.r")
test_fn <- assemble$value

我得到以下希伯来文文本:

     str_remove("פרק ×") %>% str_trim

如果我尝试告诉 source() 使用编码,我会收到一个错误,它根本不会加载:

assemble <- source("test_fn.r", encoding = "UTF-8")
Error in source("test_fn.r", encoding = "UTF-8") : 
  test_fn.r:5:20: unexpected INCOMPLETE_STRING
4:         head(1) %>% html_text() %>%
5:         str_remove("
                      ^
In addition: Warning message:
In readLines(file, warn = FALSE) :
  invalid input found on input connection 'test_fn.r'

运行 在 Windows 10 在英国。 Sys.getlocale() returns 以下内容: "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" 任何帮助将不胜感激。

正如@MrFlick 指出的那样,您在 Windows; Windows 上的 R 已知 UTF-8 字符串存在问题,因为 Windows 不像 Unix-alikes 那样支持它们。

我建议您确保您的代码文件是纯 ASCII。为此,您需要使用 \uXXXX 转义符对希伯来语字符串进行编码。找到它们有点痛苦,但这个函数会为您完成:

asEscapes <- function(x) 
  cat(paste0('"', paste(sprintf("\u%x", utf8ToInt(x)), collapse = ""), '"'))

例如,

asEscapes("מסכת")
# "\u5de\u5e1\u5db\u5ea"

所以您可以使用 str_remove("\u5de\u5e1\u5db\u5ea") 代替 str_remove("מסכת"),您应该会得到相同的结果。