2014-06-25 81 views
2

我有那種一個文本文件,填寫一個文本文件:,使用R

「你好,

我有%d的狗和%d貓,

其平均體重分別%f和%F公斤......「

我想創建的R函數,需要輸入一個向量 (例如c(2, 3, 3.4, 2.3))並使用其條目填充文本文件中的%f和%d (按正確順序)。

這應該是相當簡單的,但我找不到合適的方法來 做到這一點。謝謝!

+3

您正在尋找'sprintf'函數。 –

+1

有一個名爲'brew'的R包,它被設計用於填充模板 - 不同的語法,但是相同的結果。僅供參考 – Spacedman

回答

3

如果你能寫使用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.

你也可以在模板中做循環。沒有8192個字符限制,如sprintf

+0

太好了,謝謝。這正是我所期待的。 –

3

正如@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)) 
+0

謝謝!一個問題,但:如果我有一個文件「tmp.text」,爲了使用sprintf()我應該加載它全部作爲單個字符字符串?因爲我試圖做到這一點,我從sprintf()得到一個錯誤,因爲我的文本大於8192字節。另一方面,如果我使用readLines,我會得到一個向量,其中每行都是不同的條目,所以使用sprintf並不像上面的示例那樣簡單... –