将data.frame写入电子表格:编码问题

时间:2014-08-16 00:25:16

标签: r character-encoding instagram xlconnect

我从Instagram中提取了一些数据。所有API请求都由

完成
fromJSON(rawToChar(GET(url)$content))

当我尝试使用renderTable()在Shiny应用程序中显示该数据帧时 我收到错误消息

Error in sort.list(y) : 
  invalid input 'Ivy Manhattan í ¼í½‰' in 'utf8towcs'

好吧,它看起来像编码问题。 Ivy Manhattan í ¼í½‰是Instagram用户的全名。 Intersting是,当我使用rederDataTable()时,输出正确呈现。当然,为什么我不用它呢?

实际问题是,我希望能够使用包XLConnect将此数据帧写入电子表格。当程序到达命令writeWorksheet(wb, data)时,我得到同样的错误。

是因为R不知道这些字符吗?我怎样才能过滤"有问题的字符串的数据框?

首先编辑作为对MrFlick评论的反应:

当我获取API请求时,我得到的是

GET(paste("https://api.instagram.com/v1/users/143/?client_id=f714dd*********58b18f"))$content

[1] 7b 22 6d 65 74 61 22 3a 7b 22 63 6f 64 65 22 3a 32 30 30 7d 2c 22 64 61 74 61 22  3a 7b 22 75 73 65 72 6e 61 6d 65 22 ... AND SO ON

rawToChar()将其转换为fromJSON()

可读/接受的JSON字符串

@MrFlick第二次编辑:

以下是我机器上Sys.getlocale()的输出:

> Sys.getlocale()
[1] "LC_COLLATE=German_Germany.1252;LC_CTYPE=German_Germany.1252
LC_MONETARY=German_Germany.1252;LC_NUMERIC=C;LC_TIME=German_Germany.1252"

GET将使用utf-8编码的提取字符串声明。当我尝试转换那些

iconv(x, from="utf-8", to="ASCII",sub="")

没有任何改变。

2 个答案:

答案 0 :(得分:1)

我试图对JSON部分data$fullname进行编码,因为这似乎是问题所在。我一开始尝试Encoding(data$fullname) = "UTF-8"并没有解决问题。但后来我切换到latin1,电子表格就发生了。谢谢你的咄咄逼人的想法! :)

答案 1 :(得分:0)

如上所述,使用

可能更好
content(GET(url), as="parsed", encoding="UTF-8")

这利用了httr包为您解码内容的能力。

请注意,当您在输出中看到<U+2800>时,这并不意味着字符串中会出现这些确切的字符。这是R的转义unicode字符的方式,就像它增加了额外的斜线以逃避其他特殊字符,如\r。您正在查看这些字符,因为如果您的区域设置。你没有提到你在使用什么操作系统。默认情况下,Mac将使用UTF-8,并应尝试显示这些字符。我没有访问Windows机器来测试默认值是什么。当语言环境“LC_ALL”设置为“C”时,它们似乎显示为“”。返回

Sys.getlocale()
# [1] "C/C/C/C/C/en_US.UTF-8"

x <- "\u2800\u2800\u2800Jenny";
print(x)
# [1] "<U+2800><U+2800><U+2800>Jenny"

因此字符串中实际上没有小于/大于符号或大写字母U.这就是C编码将如何显示它们。如果要删除非ascii字符,可以执行

iconv(x, from="UTF-8", to="ASCII", sub="")
# [1] "Jenny"

Excel可以很好地处理其他类型的编码,但我个人不知道如何使用XLConnect来管理