У меня следующая проблема: у меня есть файл .Rmd, который я компилирую в html с помощью knitr + pandoc с помощью кнопки Rstudio. В этом файле .Rmd я передаю данные json на уровень js, следуя методу, описанному здесь: http://livefreeordichotomize.com/2017/01/24/custom-javascript-visualizations-in-rmarkdown/
Это потому, что я хочу использовать данные для некоторых настраиваемых визуальных элементов d3. Кажется, это хорошо работает для скромных объемов данных, однако, когда я пытаюсь передать большие данные, у меня возникают проблемы с компиляцией из .Rmd в html; проблема, похоже, связана с pandoc, поскольку я получаю:
pandoc document conversion failed with error 137
Я безуспешно пытался поискать в Интернете объяснение этого сообщения об ошибке. Кто-нибудь знает, что означает эта ошибка?
Вероятно, это ошибка нехватки памяти. См. stackoverflow.com/questions/1041182/….





После исследования ошибки я все еще не могу ее исправить. Однако у меня есть обходной путь, который позволяет вставлять произвольные данные json в отчет html, созданный с помощью R markdown, вообще без использования pandoc; последний, похоже, не любит инъекцию большого количества json, например, метод, описанный в
http://livefreeordichotomize.com/2017/01/24/custom-javascript-visualizations-in-rmarkdown/
поскольку эта ошибка 137 кажется мне связанной с pandoc, убивающим процесс преобразования в html, поскольку для завершения требуется много времени.
Обходной путь довольно прост: вместо того, чтобы вводить данные json на этапе компиляции knitr, включая их в блок с параметром asis (как описано в приведенной выше ссылке), лучше добавить данные json в конец в html-файле, который создается компиляцией с помощью knitr и pandoc. Другими словами, вставьте данные json в выходной html-файл шагов kitr + pandoc.
Предполагая, что файл rmd, который должен быть скомпилирован в html, находится в установленном пакете, и следуя предложениям на
Лучшая практика для встраивания произвольного JSON в DOM?
для встраивания данных json в DOM можно достичь этой цели, используя пакет xml2 с такой функцией, как:
create_report <- function(file,
subdir,
package,
parameters,
output_file,
data_arr = NULL){
#check file exists
if (system.file(package = package, subdir, file) == ''){
stop('Cannot find the .rmd file')
}
#first generate report
address <- rmarkdown::render(system.file(package = package,
subdir,
file),
output_dir = getwd(),
intermediates_dir = getwd(),
output_file = output_file,
params = parameters,
clean = FALSE)
#then append the data in the json files located in the named list
#data_arr directly into the
#html after compilation if needed:
if (!is.null(data_arr)){
report <- xml2::read_html(address)
report_body <- xml2::xml_find_first(report, "body")
#adding the data
for (i in 1:length(data_arr)){
xml2::xml_add_child(report_body, "script", type = 'application/json', id =
names(data_arr[i]), data_arr[[i]])
}
#Then add a script that takes the data from the script tags added above and
#initializes the variables.
varnames <- paste0("var ", names(data_arr), " =
JSON.parse(document.getElementById('", names(data_arr), "').innerHTML);",
collapse = " ")
xml2::xml_add_child(report_body, "script", type = 'text/javascript', id =
'external_json_init', varnames)
xml2::write_html(report, address)
}
return(address)
}
В приведенной выше функции data_arr должен быть именованным списком, элементы которого представляют собой строки json, полученные, например, путем преобразования объектов R с использованием jsonlite :: toJSON, и чьи имена являются именами переменных, которые будут использоваться для хранения данных на уровне javascript. . Таким образом, json произвольного размера может быть вставлен в HTML-код, сгенерированный R markdown, для обработки с помощью javascript.
Не то же сообщение об ошибке, но может быть полезно: stackoverflow.com/questions/34687030/…