Я пытаюсь создать приложение Shiny, которое генерирует строки с несколькими виджетами selectInput или selectizeInput, когда пользователь нажимает кнопку «+», и удаляет такие строки, когда он нажимает кнопку «-». На изображении ниже показано, чего я достиг с этого момента:
Как сейчас выглядит мое блестящее приложение: https://imgur.com/uQfdJrv
Моя проблема в том, что я не могу найти способ показать виджеты в новой строке с теми же выбранными значениями виджета в предыдущей строке. На самом деле пользователь может захотеть изменить только значения одних входных данных и не трогать значения других.
Ссылаясь на изображение выше, давайте предположим, что для первого теста пользователь выбрал «Амикацин» в качестве антибиотиков и «5» в качестве УПП. Второй тест всегда с «Амикацином», но он получил значение AMR 10. Новые входы, сразу после нажатия кнопки «+», должны отображать сразу «Амикацин» и «5», и после этого пользователь просто изменит «5» второго ряда в «10».
Вот код, который я использовал:
library(shiny)
library(shinyjs)
###= UI
ui <- fluidPage(
br(),
useShinyjs(),
fluidRow(
column(width = 12,
actionButton(inputId = "add_amr_test",
label = icon(name = "plus",
lib = "font-awesome")),
actionButton(inputId = "remove_amr_test",
label = icon(name = "minus",
lib = "font-awesome")),
div(style = "display: inline-block;
padding: 0px 10px;",
h5("Add or remove an antimicrobial resistance test")),
tags$div(id = "amr_test_placeholder")
)
),
br()
)
###= SERVER
server <- function(input, output, session) {
Antibiotics_name <- c("", "Amikacin", "Ampicillin", "Tetracycline")
observe({
toggleState(id = "remove_amr_test",
condition = input$add_amr_test > input$remove_amr_test)
})
amr_test_values <- reactiveValues(val = 0)
###= Add ui
observeEvent(input$add_amr_test, {
amr_test_divId <- length(amr_test_values$val) + 1
insertUI(
selector = "#amr_test_placeholder",
where = "beforeBegin",
ui = tags$div(
id = amr_test_divId,
fluidRow(
br(),
column(width = 3,
selectizeInput(inputId = paste0("drug_",
input$add_amr_test - input$remove_amr_test),
label = h5(paste0("Antibiotic ",
input$add_amr_test - input$remove_amr_test)),
choices = Antibiotics_name,
selected = "")
),
column(width = 1,
selectizeInput(inputId = paste0("rescom_",
input$add_amr_test - input$remove_amr_test),
label = h5(paste0("AMR ",
input$add_amr_test - input$remove_amr_test)),
choices = c("",
seq(from = 1,
to = 100,
by = 1)),
selected = "")
)
)
)
)
amr_test_values$val <- c(amr_test_values$val,
amr_test_divId)
})
###= Remove ui
observeEvent(input$remove_amr_test, {
removeUI(
selector = paste0('#', amr_test_values$val[length(amr_test_values$val)])
)
amr_test_values$val <- amr_test_values$val[-length(amr_test_values$val)]
})
}
###= RUN APP
shinyApp(ui = ui, server = server)
Наконец, вот изображение с ожидаемыми результатами, полученными после того, как пользователь нажмет кнопку «+» для создания второго ряда виджетов.
Пример ожидаемого результата: https://imgur.com/NIpOZOE
И последний вопрос: как только каждый виджет от пользователя имеет определенное значение, как лучше всего хранить все эти значения внутри фрейма данных?
Большое спасибо.