Заполните текстовый файл с помощью R

#string #r #text #stringr

#строка #r #текст #stringr

Вопрос:

У меня есть текстовый файл такого рода:

«Привет,

У меня есть %d dogs и %d cats,

который в среднем весит соответственно%f и%f килограммов … «

Я пытаюсь создать функцию R, которая принимает в качестве входных данных вектор (например c(2, 3, 3.4, 2.3) ) и использует его записи для заполнения %f и %d в текстовом файле (в правильном порядке). Порядок).

Это должно быть довольно просто, но я не могу найти правильный способ сделать это. Спасибо!

Комментарии:

1. Вы ищете sprintf функцию.

2. Существует вызываемый пакет R brew , который предназначен для заполнения шаблонов — синтаксис отличается от этого, но результаты те же. Просто к вашему сведению

Ответ №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.

Вы также можете выполнять циклы в шаблоне. Там нет ограничения на 8192 символа, подобного sprintf .

Комментарии:

1. Отлично, спасибо. Это именно то, что я искал.

Ответ №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))
 

Комментарии:

1. Спасибо! Однако есть одна проблема: если у меня есть файл «tmp.text», должен ли я загрузить все это в виде строки из одного символа, чтобы использовать sprintf()? Потому что я попытался это сделать, и я получаю сообщение об ошибке от sprintf(), потому что мой текст больше 8192 байт. С другой стороны, если я использую строки чтения, я получаю вектор, в котором каждая строка является отдельной записью, поэтому использование sprintf не так просто, как в приведенном выше примере…