临时更改语言环境设置

Rap*_*ter 5 locale r strptime

实际问题

如何临时更改/指定用于某些函数调用的语言环境设置(例如strptime())?

背景

我只是运行了以下rvest演示:

demo("tripadvisor", package = "rvest")

当涉及到要删除日期的部分时,我遇到了一些很可能是由我的语言环境设置引起的问题:当我在德语语言环境中时,日期采用美式英语格式:

require("rvest")
url <- "http://www.tripadvisor.com/Hotel_Review-g37209-d1762915-Reviews-JW_Marriott_Indianapolis-Indianapolis_Indiana.html"

reviews <- url %>%
  html() %>%
  html_nodes("#REVIEWS .innerBubble")

date <- reviews %>%
  html_node(".rating .ratingDate") %>%
  html_attr("title")
> date
 [1] "December 9, 2014" "December 9, 2014" "December 8, 2014" "December 8, 2014"
 [5] "December 6, 2014" "December 5, 2014" "December 5, 2014" "December 3, 2014"
 [9] "December 3, 2014" "December 3, 2014"
Run Code Online (Sandbox Code Playgroud)

基于此输出,我将使用以下格式:(%B %e, %Y%B%e, %Y取决于“带一个空格的单位数字的实际含义”实际上是指WRT到该开头的空格;请参见参考资料?strptime)。

但是,两者都失败了:

strptime(date, "%B %e, %Y")
strptime(date, "%B%e, %Y")
Run Code Online (Sandbox Code Playgroud)

我想这是由于%B希望月份名称使用德语而不是英语:

当前语言环境中的完整月份名称。(还匹配输入的缩写名称。)


编辑

Sys.setlocale()让我们更改您的区域设置。但是,在调用依赖于语言环境设置的函数之后,似乎不可能这样做。即,您需要从一个新的R会话开始,以使语言环境更改生效。这使得临时更改有些麻烦。任何想法如何解决这个问题?

这是我的语言环境:

> Sys.getlocale(category = "LC_ALL")
[1] "LC_COLLATE=German_Germany.1252;LC_CTYPE=German_Germany.1252;LC_MONETARY=German_Germany.1252;LC_NUMERIC=C;LC_TIME=German_Germany.1252"
Run Code Online (Sandbox Code Playgroud)

当我在第一次运行之前对其进行更改strptime()时,一切正常:

Sys.setlocale(category = "LC_ALL", locale = "us")
> strptime(date, "%B %e, %Y")
 [1] "2014-12-09 CET" "2014-12-09 CET" "2014-12-08 CET" "2014-12-08 CET" "2014-12-06 CET"
 [6] "2014-12-05 CET" "2014-12-05 CET" "2014-12-03 CET" "2014-12-03 CET" "2014-12-03 CET"
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行进行stptime()了更改,则该更改似乎无法被识别

> Sys.setlocale(category = "LC_ALL", locale = "German")
[1] "LC_COLLATE=German_Germany.1252;LC_CTYPE=German_Germany.1252;LC_MONETARY=German_Germany.1252;LC_NUMERIC=C;LC_TIME=German_Germany.1252"
> strptime(date, "%B %e, %Y")
 [1] "2014-12-09 CET" "2014-12-09 CET" "2014-12-08 CET" "2014-12-08 CET" "2014-12-06 CET"
 [6] "2014-12-05 CET" "2014-12-05 CET" "2014-12-03 CET" "2014-12-03 CET" "2014-12-03 CET"
Run Code Online (Sandbox Code Playgroud)

NA如果已经执行了更改回德语语言环境的操作,则实际上这将导致的向量。

Fel*_*lix 6

parse_date_time()lubridate包装中找到您想要的。它具有locale用于根据特定语言环境解析字符串的显式选项。

parse_date_time(date, orders = "B d, Y", locale = "us")
Run Code Online (Sandbox Code Playgroud)

给你:

[1] "2016-02-26 UTC" "2016-02-26 UTC" "2016-02-26 UTC" "2016-02-24 UTC" "2016-02-23 UTC" "2016-02-21 UTC"
[7] "2016-02-21 UTC" "2016-02-21 UTC" "2016-02-20 UTC" "2016-02-20 UTC"
Run Code Online (Sandbox Code Playgroud)

请注意,您提供的解析格式不带,%就像您在中那样strptime()