Используйте htmltool :: withTags со строковым вводом - PullRequest
0 голосов
/ 25 июня 2019

Я хочу использовать вывод RMD HTML для своих проектов R и использую DT для создания динамических таблиц, в которых можно реализовать настраиваемые заголовки (например, классы ячеек, colspan, rowspan), предоставив пользовательский заголовок с функцией withtags, как в пример из DT документов.

Они использовали функцию withtags вот так

htmltools::withTags(table(
class = 'display',
thead(
tr(
  th(rowspan = 2, "Test1"),
  th(rowspan = 2, "Test2"),
  th(rowspan = 2, "Test3")
)
)
)

чтобы получить вывод, подобный этому:

<table class="display">
<thead>
<tr>
  <th rowspan="2">Test1</th>
  <th rowspan="2">Test2</th>
  <th rowspan="2">Test3</th>
</tr>
</thead>
</table>

Теперь я хотел создать вышеупомянутую структуру динамически, как это (вы можете запустить это как отдельный RMD)

library(DT)

# sample data

columns_header1 <- c(2,1,1,3)
columns_header2 <- c(1,1,1,1,1,1,1)
classes_header1 <- c("headerlightturquoise small","seperator","seperator","small")
classes_header2 <- c("small","small","small","small","small","small","small")
names_header1 <- c("2 Column Name","One Column","One Column","3 Column Name")
names_header2 <- c("One Column","One Column","One Column","One Column","One Column","One Column","One Column")

header1 <- list("columns" = columns_header1, "classes" = classes_header1, "names" = names_header1)
header2 <- list("columns" = columns_header2, "classes" = classes_header2, "names" = names_header2)

header <- list(header1,header2)

# create the string

tmp_custom_table_header <- "table(class='display', thead("

for(i in seq(1,length(header))) {
  tmp_custom_table_header <- paste(tmp_custom_table_header,"tr(")
    for(j in seq(1,length(header[[i]]$columns))) {
      tmp_custom_table_header <- paste(tmp_custom_table_header,"th(colspan=",header[[i]]$columns[j],", '", header[[i]]$names[j], "',", "class='", header[[i]]$classes[j], "')")

          if(j < length(header[[i]]$columns)) {
            tmp_custom_table_header <- paste(tmp_custom_table_header,",")
          }


    }
    tmp_custom_table_header <- paste(tmp_custom_table_header,")")

    if(i < length(header)) {
      tmp_custom_table_header <- paste(tmp_custom_table_header,",")
    }
}

tmp_custom_table_header <- paste0(tmp_custom_table_header,"))")

# usage of withTags

custom_table_header <- htmltools::withTags({tmp_custom_table_header})

# test for display

testdata <- mtcars %>%
  select(mpg,cyl,disp,hp,drat,wt,qsec)

testdata %>%
  DT::datatable(
    class = 'stripe row-border order-column',
    container = custom_table_header,
    escape=FALSE,
    colnames = header[[2]]$names,
    options=list(sDom  = '<"top"><"bottom">'),
    rownames = FALSE
  )

К сожалению, withTags не принимает мою строку в качестве правильного ввода. Каким был бы предложенный способ

  • создать структуру динамически, используя удобный синтаксис и
  • правильно проанализируйте его в формате, который я могу использовать с DT.

Спасибо! Stephan

...