R 控制系统中更新的顺序
这里是一个MWE:R 控制系统中更新的顺序,r,shiny,shinyjs,R,Shiny,Shinyjs,这里是一个MWE: library(shiny) runApp(shinyApp( ui = pageWithSidebar( fluidRow( column(3, wellPanel( numericInput("numFields", "Select number of fields", 2, min = 1), br(), uiOutput("fields"), br(), actionButton("goButton", "Go
library(shiny)
runApp(shinyApp(
ui = pageWithSidebar(
fluidRow(
column(3, wellPanel(
numericInput("numFields", "Select number of fields", 2, min = 1),
br(),
uiOutput("fields"),
br(),
actionButton("goButton", "Go!")
)),
column(3, wellPanel(
uiOutput("morefields")
)),
column(3, wellPanel(
numericInput("numFields2", "Select number of fields 2", 2, min = 1),
br(),
actionButton("goButton2", "Go2!")
))
),
server = function(input, output, session){
output$fields <- renderUI({
numFields <- as.integer(input$numFields)
lapply(1:numFields, function(i) {
textInput(paste0("field", i), paste0("Type in field ", i))
})
})
output$morefields <- renderUI({
if (input$goButton == 0) return(NULL)
isolate({
numFields <- as.integer(input$numFields)
lapply(1:numFields, function(i) {
checkboxInput(paste0("checkbox", i), paste0("Checkbox for field ",
input[[paste0("field", i)]]))
})
})
})
observeEvent(input$goButton2, {
numFields2 <- as.integer(input$numFields2)
last_field <- paste0("field", numFields2)
updateNumericInput(session, "numFields", value = numFields2)
updateTextInput(session, "field1", value = "This is the first field")
updateTextInput(session, last_field, value = "This is the last field")
})
}))
现在生成了第二个UI,但字段仍然为空。我必须点击Go2!在所有UI完全更新之前,执行三次
我还尝试在服务器部件中执行以下操作:
同样,事件的过程看起来有点不同,但仍然需要点击三次才能得到我想要的
关于如何通过点击Go2获得最终结果的任何建议!按钮只按下一次?我能够扩展您的想法并使其生效,尽管我必须承认这不是最漂亮的解决方案。第一个问题是,在调用更新文本字段的值之前,您需要确保文本字段已生成,因此我添加了一个
isolate(
if (vals$update == 1) {
vals$update <- 2
}
)
希望这有帮助
observeEvent(input$goButton2, {
numFields2 <- as.integer(input$numFields2)
updateNumericInput(session, "numFields", value = numFields2)
}, priority = 2)
observeEvent(vals$update, {
numFields2 <- as.integer(input$numFields2)
last_field <- paste0("field", numFields2)
updateTextInput(session, "field1", value = "This is the first field")
updateTextInput(session, last_field, value = "This is the last field")
}, priority = 1)
observeEvent(input$goButton2, {
js$click("goButton")
}, priority = 0)
isolate(
if (vals$update == 1) {
vals$update <- 2
}
)
library(shiny)
library(shinyjs)
jscode <- "shinyjs.click = function(id) { setTimeout(function(){ $('#' + id).click(); }, 50); }"
runApp(shinyApp(
ui = fluidPage(
useShinyjs(),
extendShinyjs(text = jscode),
fluidRow(
column(3, wellPanel(
numericInput("numFields", "Select number of fields", 2, min = 1),
br(),
uiOutput("fields"),
br(),
actionButton("goButton", "Go!")
)),
column(3, wellPanel(
uiOutput("morefields")
)),
column(3, wellPanel(
numericInput("numFields2", "Select number of fields 2", 2, min = 1),
br(),
actionButton("goButton2", "Go2!")
))
)),
server = function(input, output, session){
vals <- reactiveValues(update = 0)
output$fields <- renderUI({
isolate(
if (vals$update == 1) {
vals$update <- 2
}
)
numFields <- as.integer(input$numFields)
lapply(1:numFields, function(i) {
textInput(paste0("field", i), paste0("Type in field ", i))
})
})
output$morefields <- renderUI({
if (input$goButton == 0) return(NULL)
isolate({
numFields <- as.integer(input$numFields)
lapply(1:numFields, function(i) {
checkboxInput(paste0("checkbox", i), paste0("Checkbox for field ",
input[[paste0("field", i)]]))
})
})
})
observeEvent(input$goButton2, {
numFields2 <- as.integer(input$numFields2)
vals$update <- 1
updateNumericInput(session, "numFields", value = numFields2)
})
observeEvent(vals$update, {
if (vals$update != 2) return(NULL)
numFields2 <- as.integer(input$numFields2)
last_field <- paste0("field", numFields2)
updateTextInput(session, "field1", value = "This is the first field")
updateTextInput(session, last_field, value = "This is the last field")
vals$update <- 3
})
observeEvent(vals$update, {
if (vals$update != 3) return(NULL)
js$click("goButton")
vals$update <- 0
})
})
)