publicar - R Brillante: Manejar botones de acción en la tabla de datos
shiny r studio ejemplos (1)
Tengo una aplicación R Shiny con una tabla de datos.
Una columna contiene botones de acción con una ID única.
Me gustaría manejar los clics en esos botones, pero desafortunadamente, mi código de manejo de eventos (una simple declaración de impresión) nunca se ejecuta.
Vea este ejemplo
app.R
(
app.R
):
library(shiny)
library(DT)
ui <- shinyUI(
fluidPage(
title = "DataTable with Buttons",
fluidRow(
column(
width = 8,
dataTableOutput("employees")
)
)
)
)
server <- shinyServer(function(input, output) {
df <- data.frame(
name = c(''Dilbert'', ''Alice'', ''Wally'', ''Ashok'', ''Dogbert''),
motivation = c(62, 73, 3, 99, 52),
stringsAsFactors = FALSE
)
fireButtons <- list()
fireButtonIds <- list()
for (r in rownames(df)) {
id <- paste("fire_", r, sep = "")
fireButtonIds[[r]] <- id
button <- actionButton(id, label = "Fire")
fireButtons[[r]] <- as.character(button)
}
df$actions <- fireButtons
dt <- datatable(df, colnames = c("#", "Name", "Motivation", "Actions"))
output$employees <- renderDataTable(dt)
for (id in fireButtonIds) {
# binding doesn''t work
# - is the path wrong?
# - is it because the button is really a string, not an object?
observeEvent(input$employees$x$data$actions[[id]], {
print(paste("click on", i))
})
}
})
shinyApp(ui = ui, server = server)
Veo dos posibles problemas:
-
La ruta que estoy usando (
input$employees$x$data$actions[[id]]
) es simplemente incorrecta - La ruta que estoy usando es correcta, pero no apunta a algo que realmente podría manejarse, es decir, es solo una cadena HTML y no un objeto de botón.
¿O tal vez hay una mejor aproximación para poner botones dentro de una tabla de datos ...?
¿Esto logra lo que estás tratando de hacer?
library(shiny)
library(DT)
shinyApp(
ui <- fluidPage(
DT::dataTableOutput("data"),
textOutput(''myText'')
),
server <- function(input, output) {
myValue <- reactiveValues(employee = '''')
shinyInput <- function(FUN, len, id, ...) {
inputs <- character(len)
for (i in seq_len(len)) {
inputs[i] <- as.character(FUN(paste0(id, i), ...))
}
inputs
}
df <- reactiveValues(data = data.frame(
Name = c(''Dilbert'', ''Alice'', ''Wally'', ''Ashok'', ''Dogbert''),
Motivation = c(62, 73, 3, 99, 52),
Actions = shinyInput(actionButton, 5, ''button_'', label = "Fire", onclick = ''Shiny.onInputChange(/"select_button/", this.id)'' ),
stringsAsFactors = FALSE,
row.names = 1:5
))
output$data <- DT::renderDataTable(
df$data, server = FALSE, escape = FALSE, selection = ''none''
)
observeEvent(input$select_button, {
selectedRow <- as.numeric(strsplit(input$select_button, "_")[[1]][2])
myValue$employee <<- paste(''click on '',df$data[selectedRow,1])
})
output$myText <- renderText({
myValue$employee
})
}
)