R Shiny: Обрабатывать кнопки действий в таблице данных
У меня есть приложение R Shiny с таблицей данных. Один столбец содержит кнопки действий с уникальным идентификатором. Я хотел бы обрабатывать нажатия на эти кнопки, но, к сожалению, мой код обработки событий (простой оператор печати) никогда не выполняется. Смотрите этот автономный пример (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)
Я вижу две возможные проблемы:
- Путь я использую (
input$employees$x$data$actions[[id]]
) просто неправильно - Путь, который я использую, является правильным, но он не указывает на то, что действительно может быть обработано, то есть это просто строка HTML, а не объект кнопки.
Или, может быть, есть лучший способ поместить кнопки в таблицу данных...?
1 ответ
Решение
Это делает то, что вы пытаетесь сделать?
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
})
}
)