formatstyle - r datatable extension
Usar entradas brillantes dentro de una salida de DataTable (1)
Un objeto de entrada shiny
correcto es un objeto shiny.tag
, que no se puede poner en un data.frame. Si lo haces, recibirás el siguiente mensaje de error:
Error en as.data.frame.default (x [[i]], opcional = TRUE, stringsAsFactors = stringsAsFactors): no se puede forzar la clase "" shiny.tag "" a un data.frame
En su ejemplo, el objeto radio_inputs
que obtiene es, de hecho, una lista de character
, que es un código HTML puro. Por lo tanto, todavía obtienes la IU, pero ya no funcionan como entradas brillantes.
Supongo que la única forma es usar una tabla HTML pura si quieres botones de opción u otros objetos de entrada brillantes dentro de una tabla.
Me gustaría crear dinámicamente una serie de widgets de entrada para usar en cada fila de tabla de datos. Puedo mostrar con éxito dicha lista de entradas en la tabla, sin embargo, tengo problemas para acceder al valor de estas entradas dinámicas.
ui.R
library(shiny)
ui <- fluidPage(
fluidRow(
radioButtons(''original'',''Normal Radio Button'',c(''1'',''2'',''3'',''4'',''5'')),
DT::dataTableOutput("table")
)
)
servidor.R
library(DT)
multipleRadio <- function(FUN, id_nums, id_base, label, choices, ...) {
inputs <- 1:length(id_nums)
for (i in 1:length(inputs)) {
inputs[i] <- as.character(FUN(paste0(id_base, id_nums[i]),label, choices, ...))
}
return(inputs)
}
radio_inputs <- multipleRadio(radioButtons,
as.character(1:3),
''input_'',
''Radio Button'',
c(''1'',''2'',''3'',''4'',''5''),
inline = TRUE)
output_table <- data.frame(id = c(1,2,3),
name=c(''Item 1'',''Item 2'',''Item 3''),
select = radio_inputs)
server <- function(input, output, session) {
observe({
print(paste(''original: '',input$original))
print(paste(''input 1: '',input$input_1))
print(paste(''input 2: '',input$input_2))
print(paste(''input 3: '',input$input_3))
})
output$table <- renderDataTable({
datatable(output_table,rownames= FALSE,escape = FALSE,selection=''single'',
options = list(paging = FALSE,ordering=FALSE,searching=FALSE))
})
}
Defino una función que genera múltiples entradas de radioButton y las convierte en su representación HTML usando as.character. Esto genera una serie de entradas cuyos identificadores son "input_1", "input_2" y "input_3". Lleno una columna de la tabla de salida con las entradas de radio. La visualización de los radioButtons funciona como se esperaba. Veo uno en cada fila. Sin embargo, la input$input_1
, input$input_2
y input$input_3
no parecen existir y no hay respuesta al hacer clic en estos botones. ¡Cualquier consejo sobre lo que está pasando aquí sería muy apreciado!
Editar:
Encontré una solución aquí: http://www.stackoverflow.red/questions/32993257/shiny-datatables-with-interactive-elements
El uso de la función Shiny.bindAll cuando renderiza la tabla de datos parece convertir las entradas de HTML en objetos de entrada Brillantes.
output$table <- renderDataTable({
datatable(output_table,rownames= FALSE,escape = FALSE,selection=''single'',
options = list(paging = FALSE,ordering=FALSE,searching=FALSE,
preDrawCallback=JS(''function() { Shiny.unbindAll(this.api().table().node()); }''),
drawCallback=JS(''function() { Shiny.bindAll(this.api().table().node()); } '')))
})