在 R Shiny 中,如何在模态对话框中反应性地重置用户输入?
In R Shiny, how to reactively reset user inputs inside a modal dialogue box?
下面的 MWE 代码按预期工作,除了我想单击模态对话框中的“重置”操作按钮以使模态对话框中的矩阵输入网格立即(反应性地)重置为默认值(对象 matrix3Default
) 和主面板中渲染的 table 也立即(反应性地)重置为默认值(对象 matrix3Default
)。
按照草案,单击“重置”后,矩阵输入网格和在主面板中呈现的 table 仅在用户单击侧边栏面板中的“修改...”操作按钮后才重新呈现.
当用户点击“重置”时,如何让“重置”按钮立即响应?
我未成功尝试执行此操作在下面的“BELOW ATTEMPT...”下显示
当 运行 出现这种情况时,将 changes/additions 设为用户输入网格,这样您就可以看到它是如何重置的。
MWE 代码:
library(shiny);library(shinyMatrix);library(shinyjs)
colnames(matrix3Default) <- paste0("Series ",1:ncol(matrix3Default))
matrix3Default <- matrix(c(1,24,0,100),4,1,dimnames=list(matrix3Headers(), NULL))
matrix3Headers <- function(){c('A','B','C','D')}
matrix3Input <- function(x, matrix3Default){
matrixInput(x,label='Input series terms into below grid:',value=matrix3Default,
rows= list(extend=FALSE,names=TRUE),cols= list(extend=TRUE,names=TRUE,
editableNames=FALSE,delete=TRUE),class='numeric')}
ui <-
pageWithSidebar(
headerPanel("Model..."),
sidebarPanel(
fluidRow(helpText(h5(strong("Base Input Panel")))),
uiOutput("Panels")
), # close sidebar panel
mainPanel(
tabsetPanel(
tabPanel("Liabilities module", value=4,
fluidRow(h5(strong(helpText("Select model output to view:")))),
fluidRow(actionButton('showLiabStructBtn','Liabilities')),
div(style = "margin-top: 5px"),
uiOutput('showResults')),
id = "tabselected"
) # close tabset panel
) # close main panel
) # close page with sidebar
server <- function(input,output,session)({
showResults <- reactiveValues()
rv <- reactiveValues(
mat3 = matrix3Input('matrix3',matrix3Default),
input = matrix3Default,
colHeader = colnames(input))
output$Panels <- renderUI({
tagList(
conditionalPanel(
condition="input.tabselected==4",
actionButton('modLiabStruct','Modify Liabilities Structure'))
) # close tagList
}) # close renderUI
vectorLiabStruct <- reactive({
if(!isTruthy(input$modLiabStruct)){
df <- matrix3Default
df
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
}
else{
req(input$matrix3)
rv$mat3 <- matrix3Input('matrix3',input$matrix3)
df <- input$matrix3
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
rv$input <- df
} # close else
df})
output$table3 <- renderTable({
if(!isTruthy(input$modLiabStruct)){
df <- matrix3Default
df
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
}
else{
req(input$matrix3)
rv$mat3 <- matrix3Input('matrix3',input$matrix3)
df <- input$matrix3
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
rv$input <- df
} # close else
df},rownames=TRUE, colnames=TRUE)
observeEvent(input$modLiabStruct,{
showModal(modalDialog(
rv$mat3,
footer = tagList(
actionButton("resetLiabStruct","Reset"),
modalButton("Close")
), # close tag list
)) # close show modal and modal dialog
}) # close observe event
observeEvent(input$showLiabStructBtn,{showResults$showme<-tagList(tableOutput("table3"))},ignoreNULL=FALSE)
# BELOW ATTEMPT...
observeEvent(input$resetLiabStruct,{
rv$input <- matrix3Default
rv$mat3 <- matrix3Input('matrix3',matrix3Default)
{showResults$showme <- tagList(tableOutput("table3"))}
},ignoreNULL = TRUE) # close observe event
output$showResults <- renderUI({showResults$showme})
}) # close server
shinyApp(ui, server)
您之所以会出现此行为,是因为一旦您的第一个 observeEvent()
(input$modLiabStruct
) 加载,模式框中显示的 matrix3
不会自行刷新。
因为它是 matrixInput
,您需要使用 updateInput 类型的函数更新它,幸运的是它是 provided by the shinyMatrix package。您可以按如下方式修改您的observeEvent
:
observeEvent(input$resetLiabStruct, {
updateMatrixInput(session, 'matrix3', matrix3Default)
})
下面的 MWE 代码按预期工作,除了我想单击模态对话框中的“重置”操作按钮以使模态对话框中的矩阵输入网格立即(反应性地)重置为默认值(对象 matrix3Default
) 和主面板中渲染的 table 也立即(反应性地)重置为默认值(对象 matrix3Default
)。
按照草案,单击“重置”后,矩阵输入网格和在主面板中呈现的 table 仅在用户单击侧边栏面板中的“修改...”操作按钮后才重新呈现.
当用户点击“重置”时,如何让“重置”按钮立即响应?
我未成功尝试执行此操作在下面的“BELOW ATTEMPT...”下显示
当 运行 出现这种情况时,将 changes/additions 设为用户输入网格,这样您就可以看到它是如何重置的。
MWE 代码:
library(shiny);library(shinyMatrix);library(shinyjs)
colnames(matrix3Default) <- paste0("Series ",1:ncol(matrix3Default))
matrix3Default <- matrix(c(1,24,0,100),4,1,dimnames=list(matrix3Headers(), NULL))
matrix3Headers <- function(){c('A','B','C','D')}
matrix3Input <- function(x, matrix3Default){
matrixInput(x,label='Input series terms into below grid:',value=matrix3Default,
rows= list(extend=FALSE,names=TRUE),cols= list(extend=TRUE,names=TRUE,
editableNames=FALSE,delete=TRUE),class='numeric')}
ui <-
pageWithSidebar(
headerPanel("Model..."),
sidebarPanel(
fluidRow(helpText(h5(strong("Base Input Panel")))),
uiOutput("Panels")
), # close sidebar panel
mainPanel(
tabsetPanel(
tabPanel("Liabilities module", value=4,
fluidRow(h5(strong(helpText("Select model output to view:")))),
fluidRow(actionButton('showLiabStructBtn','Liabilities')),
div(style = "margin-top: 5px"),
uiOutput('showResults')),
id = "tabselected"
) # close tabset panel
) # close main panel
) # close page with sidebar
server <- function(input,output,session)({
showResults <- reactiveValues()
rv <- reactiveValues(
mat3 = matrix3Input('matrix3',matrix3Default),
input = matrix3Default,
colHeader = colnames(input))
output$Panels <- renderUI({
tagList(
conditionalPanel(
condition="input.tabselected==4",
actionButton('modLiabStruct','Modify Liabilities Structure'))
) # close tagList
}) # close renderUI
vectorLiabStruct <- reactive({
if(!isTruthy(input$modLiabStruct)){
df <- matrix3Default
df
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
}
else{
req(input$matrix3)
rv$mat3 <- matrix3Input('matrix3',input$matrix3)
df <- input$matrix3
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
rv$input <- df
} # close else
df})
output$table3 <- renderTable({
if(!isTruthy(input$modLiabStruct)){
df <- matrix3Default
df
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
}
else{
req(input$matrix3)
rv$mat3 <- matrix3Input('matrix3',input$matrix3)
df <- input$matrix3
n <- dim(df)[2]
colnames(df) <- paste("Series", 1:n)
rownames(df) <- matrix3Headers()
rv$input <- df
} # close else
df},rownames=TRUE, colnames=TRUE)
observeEvent(input$modLiabStruct,{
showModal(modalDialog(
rv$mat3,
footer = tagList(
actionButton("resetLiabStruct","Reset"),
modalButton("Close")
), # close tag list
)) # close show modal and modal dialog
}) # close observe event
observeEvent(input$showLiabStructBtn,{showResults$showme<-tagList(tableOutput("table3"))},ignoreNULL=FALSE)
# BELOW ATTEMPT...
observeEvent(input$resetLiabStruct,{
rv$input <- matrix3Default
rv$mat3 <- matrix3Input('matrix3',matrix3Default)
{showResults$showme <- tagList(tableOutput("table3"))}
},ignoreNULL = TRUE) # close observe event
output$showResults <- renderUI({showResults$showme})
}) # close server
shinyApp(ui, server)
您之所以会出现此行为,是因为一旦您的第一个 observeEvent()
(input$modLiabStruct
) 加载,模式框中显示的 matrix3
不会自行刷新。
因为它是 matrixInput
,您需要使用 updateInput 类型的函数更新它,幸运的是它是 provided by the shinyMatrix package。您可以按如下方式修改您的observeEvent
:
observeEvent(input$resetLiabStruct, {
updateMatrixInput(session, 'matrix3', matrix3Default)
})