#r-markdown #knitr
Вопрос:
У меня есть XML-файл ( SOME.XML
), содержимое которого я хотел бы встроить в .RMD
документ.
Если бы я был доволен тем , что XML находится непосредственно внутри .RMD
, я знаю, что мог бы просто сделать:
```xml ---some xml here--- ```
Мои смущающие попытки до сих пор:
```{xml code=readr::read_file('SOME.XML')} ```
…который не удался, так как нет механизма XML.
Я также пытался:
````{r results='asis'} cat('```xml') cat(readr::read_file('SOME.XML')) cat('```') ````
…для которого, хотя вязание завершено, вывод совсем не правильный.
Возможно ли это? (Без сомнения, здесь есть какой-то трюк, который я упускаю!)
При необходимости я мог бы провести предварительную стадию, на которой содержимое XML-файла заменяется, прежде чем впоследствии передавать измененную версию .RMD
to rmarkdown::render
. Однако я хотел бы избежать этого, если это возможно.
Обновить:
Использование readLines
, как предлагается в ответе, вызывает жалобы ...incomplete final line found on 'SOME.XML'
. Использование readr::read_file()
позволяет избежать этого для меня. Для моего конкретного проекта я сейчас использую:
```xml `r readr::read_file("SOME.XML")` ```
Спасибо @user2554330 за элегантное решение!
Комментарии:
1. Что тебе надо? Извлечь некоторые данные из xml и построить таблицу?
2. Ваш второй подход выглядит довольно близким. Что происходит не так?
Ответ №1:
Вот один из способов сделать это:
```xml `r paste(readLines("SOME.XML"), collapse = "n")` ```
Идея состоит в том, чтобы поместить XML во встроенный R-код. Я думаю, что knitr игнорирует обертки блоков, потому что они не в том {xml ...
формате, который он ищет, но он увидит встроенный код и развернет его. Затем Pandoc обработает форматирование.
Вот как изменить свой подход, чтобы заставить его работать:
````{r results='asis', echo = FALSE} cat('```xmln') cat(readr::read_file('SOME.XML'), sep = "n") cat('n```n') ````
Комментарии:
1. Ты все сделал правильно… Мне пришлось немного подправить его
readLines
, на что я жаловался....incomplete final line found on 'SOME.XML'
. Я покажу свой пересмотренный код в своем первоначальном вопросе. Спасибо!2. Учитывая ваше первое решение, больше нет необходимости использовать мою работу. Эти верхние 3-кратные строки делают свое дело.
3. В вашем оригинальном подходе есть преимущество: вы могли бы написать функцию, которая выполняла бы все это с помощью вызова типа
insertCode(file = "SOME.XML", language = "xml")
.4. Ах, хорошо… Я предполагаю, что вызов функции все равно нужно будет завернуть в
{r ...}
блок?5. Да, или встроенную разметку, как я использовал в своем первом подходе.