gpt4 book ai didi

r - 通过 launchd 使用 Rscript 时的编码问题

转载 作者:行者123 更新时间:2023-12-04 18:06:20 25 4
gpt4 key购买 nike

我在尝试使用 launchd 安排 R 脚本时遇到意外问题:在终端 (Mac OS X 10.7.5) 中使用 Rgui 或 Rscript,脚本运行没有问题,但是当使用 launchd 运行脚本时,它似乎存在编码问题。

作为一个例子,这个脚本从 Le Monde 杂志的 RSS 提要创建一个词云:

#!/usr/bin/Rscript
require(wordcloud)
require(tm)
require(XML)
titles <- xpathSApply(htmlParse("http://www.lemonde.fr/rss/une.xml"),"//item/title",xmlValue)
titles <- gsub("[[:punct:]]"," ",titles)
rss <- Corpus(VectorSource(titles),readerControl=list(language="fr"))
rss <- tm_map(rss, stripWhitespace)
rss <- tm_map(rss, function(x)removeWords(x,stopwords("fr")))
tdm <- TermDocumentMatrix(rss)
m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
png("/path/to/wordcloud.png",w=5,h=5,units="in",res=100)
par(mar=c(0,0,0,0))
wordcloud(d$word,d$freq,scale=c(3,.1),min.freq=2)
dev.off()

在使用 chmod +x 获得权限后,如果我通过 Rgui 或通过终端运行脚本,我会得到如下信息:

enter image description here

但是如果我创建一个 LaunchAgent 来安排此脚本在给定的时间间隔内使用 plist 文件运行,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>test</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/test.R</string>
</array>
</dict>
</plist>

然后加载它并启动它:

launchctl load ~/Library/LaunchAgents/test.plist
launchctl start test

这是我得到的:

enter image description here

所以我想我的问题是:
- 为什么会这样?
- 如何解决这个问题?

编辑
在 @hrbrmstr 评论之后,我在代码中插入了 writeLines(capture.output(Sys.getenv()), con="/tmp/launchenv.txt") 行。
Sys.getenv() 的内容之间的主要区别在于,对应于 Rgui 的内容包含与其他两个不同的 R_PLATFORM,而 R_LIBS 而另外两个有一个 DYLD_LIBRARY_PATHR_DEFAULT_PACKAGES
Rgui 和终端的唯一共同点,但与 launchd 的输出不同的是,PATH 包含 /usr/local/bin(这是我的计算机上不存在的文件夹,事实上)在其他一切之上。尽管如此,我还是尝试在代码中添加这两行时运行脚本:

Sys.setenv(LANG='en') #language of my GUI, just in case
Sys.setenv(PATH='/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin')

但它并没有改变任何东西。

最佳答案

我想我终于解决了这个问题,同时在不同的情况下遇到了它。

考虑这段代码,类似于问题中的代码,不同之处在于输出是一个文本文件:

#!/usr/bin/Rscript
require(wordcloud)
require(tm)
require(XML)
titles <- xpathSApply(htmlParse("http://www.lemonde.fr/rss/une.xml"),"//item/title",xmlValue)
titles <- gsub("[[:punct:]]"," ",titles)
rss <- Corpus(VectorSource(titles),readerControl=list(language="fr"))
rss <- tm_map(rss, stripWhitespace)
rss <- tm_map(rss, function(x)removeWords(x,stopwords("fr")))
tdm <- TermDocumentMatrix(rss)
m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
sink("test.txt")
for(i in d$word) cat(i,"\n")
sink()

我现在在 Mac OSX 10.10 上工作,现在问题中出现的问题也发生在通过终端启动脚本时,而不仅仅是使用 launchd。在这两种情况下生成的 test.txt 文件包含:

contre 
crise
des
2015
2<U+00A0>milliards
<U+00A0>centre
<U+00AB><U+00A0>il
<U+00AB><U+00A0>jungle<U+00A0><U+00BB>
<U+00E9>limin<U+00E9>s
<U+00E9>lus
<U+2019>attaque
<U+2019>etat
<U+2019>europe
<U+2019>euros
<U+2019>opposition
<U+2019>union
acc<U+00E9>l<U+00E8>re
...

我认为,问题不在于输入期间的编码,而实际上在于输出期间的编码。这里的sink使用了session的默认编码。

> getOption("encoding")
[1] "native.enc"

所谓的“native.enc”由 Sys.getlocale("LC_CTYPE") 根据 this comment by Brian Ripley 给出.

在 RGUI 中,我的默认编码是:

> Sys.getlocale("LC_CTYPE")
[1] "en_US.UTF-8"

而Rscript环境中的默认编码是:

$ Rscript -e 'Sys.getlocale("LC_CTYPE")'
[1] "C"

因此问题中的代码有以下(hacky)解决方案:

#!/usr/bin/Rscript
require(wordcloud)
require(tm)
require(XML)
Sys.setlocale("LC_CTYPE", "en_US.UTF-8") # <- Here
titles <- xpathSApply(htmlParse("http://www.lemonde.fr/rss/une.xml"),"//item/title",xmlValue)
titles <- gsub("[[:punct:]]"," ",titles)
rss <- Corpus(VectorSource(titles),readerControl=list(language="fr"))
rss <- tm_map(rss, stripWhitespace)
rss <- tm_map(rss, function(x)removeWords(x,stopwords("fr")))
tdm <- TermDocumentMatrix(rss)
m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
png("/path/to/wordcloud.png",w=5,h=5,units="in",res=100)
par(mar=c(0,0,0,0))
wordcloud(d$word,d$freq,scale=c(3,.1),min.freq=2)
dev.off()

关于r - 通过 launchd 使用 Rscript 时的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25808595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com