source()ing 文件会更改函数中的 BOM 字符

source()ing a file changes the BOM characters in a function

我有一个 .R 文件,其中包含几个函数,其中一个定义为:

get_entry_detail <- function(con, vec_of_entryids){

  query <- paste0("select entryId, fieldName, fieldValue
                         from `hthu-eligibility`.entry_detail
                  where entryId in (", paste(vec_of_entryids, collapse = ","), ");")

  dbGetQuery(con, query) %>%
    mutate(fieldName = ifelse(fieldName == "firstName",
                              gsub(paste(c(""), collapse = "|"), "", fieldName),
                              fieldName))

}

请注意,当 fieldName == "firstName" 时,mutate() 会剥离 

source() 这个文件位于另一个 .R 文件的顶部,但是当我在获取文件后查看函数时,函数已更改为:

> source("R/get_join_employee_data_userid.R")
> get_entry_detail
function(con, vec_of_entryids){

  query <- paste0("select entryId, fieldName, fieldValue
                         from `hthu-eligibility`.entry_detail
                  where entryId in (", paste(vec_of_entryids, collapse = ","), ");")

  dbGetQuery(con, query) %>%
    mutate(fieldName = ifelse(fieldName == "firstName",
                              gsub(paste(c(""), collapse = "|"), "", fieldName),
                              fieldName))

}

 现已更改为 。这会导致后面的函数失败,因为没有  需要删除,因此后面的连接失败。

如何防止这种情况发生?我无法调整数据库结构。

This answer 提供了解决方案。现在我的函数看起来像:

get_entry_detail <- function(con, vec_of_entryids){

  dbSendQuery(con, 'set character set "utf8"')

  query <- paste0("select entryId, fieldName, fieldValue
                         from `hthu-eligibility`.entry_detail
                  where entryId in (", paste(vec_of_entryids, collapse = ","), ");")

  dbGetQuery(con, query)
}

虽然我仍然不知道为什么当我获取文件而不是直接读取文件时字符被更改。

文件编码 OS 依赖。在我的 Linux 机器上,您的示例运行没有问题。 Linux 使用 UTF-8 作为默认编码。但是,Windows 使用系统的默认编码,这可能与 UTF-8 不同。

因此,在 source() 中明确指定 encoding="UTF-8" 应该可以解决问题:

source("R/get_join_employee_data_userid.R", encoding="UTF-8")