【问题标题】:Convert length-one character to one-byte string将长度为一的字符转换为一字节的字符串
【发布时间】:2011-08-24 05:12:53
【问题描述】:

好的,我承认标题有点误导。我目前脑残,所以我可能在这里遗漏了一些明显的东西。

我正在开发基于 R 的 webapp,我想将某些参数传递给 read.table 函数 - sep 等等。如果我将单字节字符作为sep 参数传递:,;|...,那么一切都像魅力一样,但如果我尝试传递\t,我会收到一个错误:

invalid 'sep' value: must be one byte

当然,这是因为 \t 实际上被转义了 (\\t)。有没有机会我可以逃脱转义,并“按原样”传递它 - 即单字节字符串?

【问题讨论】:

  • 你能展示你用来做这个的代码吗?我对 R 不是很熟悉,但是必须有一种方法可以在您的代码中编写文字制表符(可能写为\t);我不确定为什么它会被双重转义为\\t...
  • 这是 R 约定 - cran.r-project.org/doc/FAQ/…
  • 这看起来像我所期望的......那你为什么不能只使用"\t"?那将是一个实际的制表符,而 "\\t" 是文字“反斜杠 T”。

标签: string r escaping byte


【解决方案1】:

您需要将sep="\t" 作为参数写入read.table

在选项卡的情况下,被转义的是t。换句话说,您是在告诉 R t 并不是真正的 t,而是 tab。如果您通过使用\\ 转义\,那么您是在告诉R \ 并不真正意味着escape,而是文字\

这里有一些代码说明了sep="\t"read.table 中的正确用法。只是为了好玩,我使用textConnection 来使用连接来写入和读取,而不是使用磁盘上的文件:

# Create a tab delimited file
zz <- textConnection("foo", "w")
write.table(matrix(1:12, ncol=3), file=zz, sep="\t")
close(zz)
foo

# The simple way:
tabsep <- "\t"

# The hard way, or if data was passed from a web app and you need to clean it
tabsep <- gsub("\\\\t", "\t", "\\t")


# Read a tab delimited file
zz <- textConnection(foo)
read.table(zz, sep=tabsep)
close(zz)

这会产生以下输出:

  V1 V2 V3
1  1  5  9
2  2  6 10
3  3  7 11
4  4  8 12

【讨论】:

  • 谢谢安德烈,但我已经知道了! =( 如果将分隔符定义为长度为一的字符:sep &lt;- "\t",然后执行:read.table("somedata.txt", sep = sep),您将收到错误消息。我是否有机会将 sep 参数转换为单字节并通过它在read.table 正式?
  • 我无法重现您的错误。 (我已经按照您的要求编辑了答案 - 这在我的机器上运行良好。)
  • 它看起来很奇怪......这可能是那些“睡一觉”的错误之一。将更彻底地检查...感谢您的回复!
  • 好的,那么,我有没有机会将"\\t" 转换为"\t"? (为什么我一开始没有这样说呢?)
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 2014-04-29
  • 2022-01-18
相关资源
最近更新 更多