У меня возникли проблемы с корректной отрисовкой моего документа-кварто в HTML: он отображается, но мои таблицы не отображаются. Я использую DT::datatable(), потому что хочу иметь возможность сортировки/фильтрации строк — при рендеринге с использованием kable такой проблемы не возникает.
У меня есть данные большого опроса, и я хочу создать документ, содержащий вопрос в виде заголовка, за которым следуют сводные таблицы по этому вопросу, а затем подзаголовки и резюме с разбивкой ответов на этот вопрос по каждой демографической группе.
Для простоты сейчас я просто смотрю, как получить подзаголовки и демографические сводки для одного вопроса.
До сих пор я пробовал следующее:
for (i in 1:length(test_list)){
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[i]][1])]])$label))
if (is.null(test_list[[i]])){
next}else{
print(test_list[[i]] |> DT::datatable(rownames = F, escape = F))
}
}
Я также попробовал то же самое, не используя print(), и попытался использовать htmltools, чтобы получить необработанный код для таблиц - это было напечатано, но я не мог понять, как заставить этот необработанный код отображаться, поэтому в итоге под заголовками остался необработанный код.
Вот пример данных:
test_list <- list(structure(list(Q1 = structure(c(1L, 2L, 3L, NA), levels = c("A",
"B", "C"), label = "Label 1", class = "factor"),
N = c(67L, 28L, 6L, 20L), Mean = c(1, 1, NaN, NaN), SD = c(0,
0, NA, NA), `ResponseY` = c(2.99, 7.14, NA, NA), `NA` = c(97.01,
92.86, 100, 100)), class = "data.frame", row.names = c(NA,
-4L)), structure(list(Q2 = structure(c(1L, 2L, NA), levels = c("D",
"E"), label = "Label 2", class = "factor"),
N = c("98", "Insufficient number of responses",
"21"), Mean = c(1, NA, NaN), SD = c(0, NA, NA), `ResponseY` = c(4.08,
NA, NA), `NA` = c(95.92, NA, 100)), class = "data.frame", row.names = c(NA,
-3L)), structure(list(Q3 = structure(c(1L, 2L, 3L, 4L, 5L, 6L,
NA), levels = c("F_", "G", "H", "I", "J",
"K"), label = "Label 3", class = "factor"),
N = c("Insufficient number of responses",
"25", "33", "24", "11", "Insufficient number of responses",
"23"), Mean = c(NA, 1, 1, NaN, NaN, NA, NaN), SD = c(NA,
0, NA, NA, NA, NA, NA), `ResponseY` = c(NA, 12, 3.03,
NA, NA, NA, NA), `NA` = c(NA, 88, 96.97, 100, 100, NA, 100
)), class = "data.frame", row.names = c(NA, -7L)))
test_data <- structure(list(Q1 = structure(c(2, 2, 1, 1, 2, 2), labels = c(A = 1,
B = 2, C = 3), label = "Label 1", class = c("haven_labelled",
"vctrs_vctr", "double")), Q2 = structure(c(1, 1, 1, 1, 1, 1), labels = c(D = 1,
E = 2), label = "Label 2", class = c("haven_labelled", "vctrs_vctr",
"double")), Q3 = structure(c(3, 3, 2, 2, 4, 4), labels = c(F_ = 1,
G = 2, H = 3, I = 4, J = 5, K = 6), label = "Label 3", class = c("haven_labelled",
"vctrs_vctr", "double"))), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
Это пример выходного формата, который я ищу:
Что было достигнуто с помощью:
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[1]][1])]])$label))
test_list[[1]] |> DT::datatable(options = list(pageLength = 10), rownames = F, escape = F)
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[2]][1])]])$label))
test_list[[2]] |> DT::datatable(options = list(pageLength = 10), rownames = F, escape = F)
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[3]][1])]])$label))
test_list[[3]] |> DT::datatable(options = list(pageLength = 10), rownames = F, escape = F)
Мне просто нужно заставить его работать в цикле for.
Благодаря чистой удаче мне удалось отобразить таблицы со следующим кодом, хотя он также дает мне кучу текста, который мне не нужен:
for (i in 1:length(test_list)){
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[i]][1])]])$label))
print(htmltools::renderTags(DT::datatable(test_list[[i]])))
}






Разобрался, хотя понятия не имею, почему это нужно, чтобы это работало (если бы кто-нибудь мог объяснить, я бы очень признателен!):
Во-первых, добавление DT::datatable(matrix()) перед чтением данных — без этого или добавление его где-то после чтения данных, похоже, вообще не помогает.
Затем, когда дело доходит до фактического цикла:
for (i in 1:length(test_list)){
cat(sprintf("\n#### %s\n", attributes(test_data[[names(test_list[[i]])[1]]])$label))
print(htmltools::tagList(DT::datatable(test_list[[i]], rownames = F, escape = F)))
}