如何从 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("מסכת")
,您应该会得到相同的结果。
我在使用 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("מסכת")
,您应该会得到相同的结果。