【问题标题】:Fill in a text file using R使用 R 填写文本文件
【发布时间】:2014-06-25 15:46:51
【问题描述】:

我有一个这样的文本文件:

“你好,

我有 %d 条狗和 %d 只猫,

平均重量分别为 %f 和 %f 公斤..."

我正在尝试创建一个将向量作为输入的 R 函数 (例如c(2, 3, 3.4, 2.3))并使用其条目来填充 %f 和 %d 在文本文件中(以正确的顺序)。

这应该很简单,但我找不到合适的方法 做。谢谢!

【问题讨论】:

  • 您正在寻找sprintf 函数。
  • 有一个名为 brew 的 R 包,专为填写模板而设计 - 与此不同的语法但结果相同。仅供参考

标签: string r text stringr


【解决方案1】:

如果您可以使用 brew 包语法编写模板,您可以这样做:

I have <%= ndogs %> dogs and <%= ncats %> cats which on
average weight <%= dogweight/ndogs %> and <%= catweight/ncats %> kg
respectively

然后安装brew,然后执行:

require(brew)
dogweight=23
catweight=12
ncats=4
ndogs=2
brew("animals.txt")

产生:

I have 2 dogs and 4 cats which on
average weight 11.5 and 3 kg
respectively

您可以将其发送到另一个文件或作为文本捕获到 R 中。

您还可以在模板中执行循环。没有像 sprintf 这样的 8192 个字符的限制。

【讨论】:

  • 太好了,谢谢。这正是我想要的。
【解决方案2】:

正如@MatthewPlourde 指出的,sprintf 函数在这里应该很有用。

a<-"Hello,
I have %d dogs and %d cats,
which on average weight respectively %f and %f kilograms... "

sprintf(a, 2, 3, 3.4, 2.3)

这确实需要将向量“解包”为参数。如果你确实有向量中的值,你可以这样做

v<-c(2, 3, 3.4, 2.3)
do.call(sprintf, c(list(a), v))

【讨论】:

  • 谢谢!但是有一个问题:如果我有一个文件“tmp.text”,为了使用 sprintf(),我应该将它全部加载为单个字符串吗?因为我尝试这样做并且我从 sprintf() 收到错误,因为我的文本大于 8192 字节。另一方面,如果我使用 readLines,我会得到一个向量,其中每一行都是一个不同的条目,因此使用 sprintf 并不像上面的示例那样简单......
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2018-11-23
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多