shinyapp 循环内的 modalDialog
modalDialog inside a loop in shinyapp
看在上帝的份上,有人可以帮助我吗?如何在循环中使用 modalDialog
?我查看了一些论坛,但其中 none 令人满意或不符合我的问题。下面是模拟我的问题的最小可重现代码。 RShiny: How to have sequential Modals in for loop 中提供的解决方案不起作用,因为我在 shinyalert
函数的 text
参数中输入的 actionbutton
在 observeEvent
中未被识别。
library(shiny)
dialog_filtro <- function(ID,LabelID,messagee){
modalDialog(
title = "Menssagem importante",
messagee,
footer = tagList(
actionButton(ID[1],LabelID[1]),
actionButton(ID[2],LabelID[2])
)
)
}
ui <- fluidPage(
uiOutput('res')
)
server <- function(input, output, session) {
RESFIL <- reactiveValues(dest = NULL)
lista <- list(a=2,a=3)
grupdest <- rep(list(NA),length(lista))
RESFIL$dest <- grupdest
for(i in 1:length(lista)){
if(lista[[i]] > 0){
showModal(dialog_filtro(ID = c(paste0('yes',i),paste0('no',i)),
LabelID = c('Yes','No'),
messagee = paste0('This is the loop ',i)
))
observeEvent(input[[paste0('yes',i)]], {
RESFIL$dest[[i]] <- i+10
removeModal()
})
observeEvent(input[[paste0('no',i)]], {
RESFIL$dest[[i]] <- i+100
removeModal()
})
}else{
RESFIL$dest[[i]] <- i+1000
removeModal()
}
}
output$res <- renderPrint({ RESFIL$dest })
}
shinyApp(ui = ui, server = server)
在此先感谢您提供的任何帮助。
这是 shinyalert 的一种方式。这很奇怪,如果你在 Shiny 警报中放置一个按钮,然后单击该按钮会自动关闭警报。这就是我使用 actionLink
而不是 actionButton
的原因。单击一个 button/link 时,该应用程序没有像往常一样做出反应,因此我使用运行 Shiny.setInputValue
的 onclick
属性。如您所见,我在循环中使用 local
,否则它不会按预期工作。但我认为(我没有测试)你可以使用普通的 lapply
.
而不是 for+local
library(shiny)
library(shinyalert)
dialog_filtro <- function(i, input, session, RESFIL, ID, LabelID, messagee) {
al <- shinyalert(
title = "Menssagem importante",
text = tagList(
tags$p(messagee),
actionLink(
ID[1], LabelID[1], class = "btn btn-primary",
onclick = sprintf(
'Shiny.setInputValue("%s", true, {priority: "event"});',
ID[1]
)
),
actionLink(
ID[2], LabelID[2], class = "btn btn-primary",
onclick = sprintf(
'Shiny.setInputValue("%s", true, {priority: "event"});',
ID[2]
)
),
),
html = TRUE,
session = session
)
observeEvent(input[[ID[1]]], {
RESFIL$dest[[i]] <- i + 10
closeAlert(id = al)
}, domain = session)
observeEvent(input[[ID[2]]], {
RESFIL$dest[[i]] <- i + 100
closeAlert(id = al)
}, domain = session)
}
ui <- fluidPage(
verbatimTextOutput("res")
)
server <- function(input, output, session) {
RESFIL <- reactiveValues(dest = NULL)
lista <- list(a = 2, a = 3)
grupdest <- rep(list(0), length(lista))
RESFIL$dest <- grupdest
for (i0 in 1:length(lista)) {
local({
i <- i0
if (lista[[i]] > 0) {
dialog_filtro(
i,
input,
session,
RESFIL,
ID = c(paste0("yes", i), paste0("no", i)),
LabelID = c("Yes", "No"),
messagee = paste0("This is the loop ", i)
)
} else {
RESFIL$dest[[i]] <- i + 1000
# removeModal() not clear what you want to do here: remove which modal?
}
})
}
output$res <- renderPrint({
RESFIL$dest
})
}
shinyApp(ui = ui, server = server)
看在上帝的份上,有人可以帮助我吗?如何在循环中使用 modalDialog
?我查看了一些论坛,但其中 none 令人满意或不符合我的问题。下面是模拟我的问题的最小可重现代码。 RShiny: How to have sequential Modals in for loop 中提供的解决方案不起作用,因为我在 shinyalert
函数的 text
参数中输入的 actionbutton
在 observeEvent
中未被识别。
library(shiny)
dialog_filtro <- function(ID,LabelID,messagee){
modalDialog(
title = "Menssagem importante",
messagee,
footer = tagList(
actionButton(ID[1],LabelID[1]),
actionButton(ID[2],LabelID[2])
)
)
}
ui <- fluidPage(
uiOutput('res')
)
server <- function(input, output, session) {
RESFIL <- reactiveValues(dest = NULL)
lista <- list(a=2,a=3)
grupdest <- rep(list(NA),length(lista))
RESFIL$dest <- grupdest
for(i in 1:length(lista)){
if(lista[[i]] > 0){
showModal(dialog_filtro(ID = c(paste0('yes',i),paste0('no',i)),
LabelID = c('Yes','No'),
messagee = paste0('This is the loop ',i)
))
observeEvent(input[[paste0('yes',i)]], {
RESFIL$dest[[i]] <- i+10
removeModal()
})
observeEvent(input[[paste0('no',i)]], {
RESFIL$dest[[i]] <- i+100
removeModal()
})
}else{
RESFIL$dest[[i]] <- i+1000
removeModal()
}
}
output$res <- renderPrint({ RESFIL$dest })
}
shinyApp(ui = ui, server = server)
在此先感谢您提供的任何帮助。
这是 shinyalert 的一种方式。这很奇怪,如果你在 Shiny 警报中放置一个按钮,然后单击该按钮会自动关闭警报。这就是我使用 actionLink
而不是 actionButton
的原因。单击一个 button/link 时,该应用程序没有像往常一样做出反应,因此我使用运行 Shiny.setInputValue
的 onclick
属性。如您所见,我在循环中使用 local
,否则它不会按预期工作。但我认为(我没有测试)你可以使用普通的 lapply
.
for+local
library(shiny)
library(shinyalert)
dialog_filtro <- function(i, input, session, RESFIL, ID, LabelID, messagee) {
al <- shinyalert(
title = "Menssagem importante",
text = tagList(
tags$p(messagee),
actionLink(
ID[1], LabelID[1], class = "btn btn-primary",
onclick = sprintf(
'Shiny.setInputValue("%s", true, {priority: "event"});',
ID[1]
)
),
actionLink(
ID[2], LabelID[2], class = "btn btn-primary",
onclick = sprintf(
'Shiny.setInputValue("%s", true, {priority: "event"});',
ID[2]
)
),
),
html = TRUE,
session = session
)
observeEvent(input[[ID[1]]], {
RESFIL$dest[[i]] <- i + 10
closeAlert(id = al)
}, domain = session)
observeEvent(input[[ID[2]]], {
RESFIL$dest[[i]] <- i + 100
closeAlert(id = al)
}, domain = session)
}
ui <- fluidPage(
verbatimTextOutput("res")
)
server <- function(input, output, session) {
RESFIL <- reactiveValues(dest = NULL)
lista <- list(a = 2, a = 3)
grupdest <- rep(list(0), length(lista))
RESFIL$dest <- grupdest
for (i0 in 1:length(lista)) {
local({
i <- i0
if (lista[[i]] > 0) {
dialog_filtro(
i,
input,
session,
RESFIL,
ID = c(paste0("yes", i), paste0("no", i)),
LabelID = c("Yes", "No"),
messagee = paste0("This is the loop ", i)
)
} else {
RESFIL$dest[[i]] <- i + 1000
# removeModal() not clear what you want to do here: remove which modal?
}
})
}
output$res <- renderPrint({
RESFIL$dest
})
}
shinyApp(ui = ui, server = server)