#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 не так просто, как в приведенном выше примере…