闪亮

时间:2018-01-30 15:34:43

标签: r shiny

在闪亮的应用程序中,动态生成多个数字输入窗口小部件,每个数据输入窗口小部件的初始值都是行列号。这些值的总和也显示在主面板中。 当用户更改数字输入值时,总和会相应地更新。目前它是即时的。我想通过添加动作/提交按钮来延迟所有数字输入的主面板中的输入过程,直到我更改多个数字输入。

但是如果在渲染功能中使用了动作/提交按钮,我会收到以下错误。

  

警告:<< - 中的错误:要替换的项目数不是替换长度的倍数。

如果不在render内部放置其他位置的函数,因为这些小部件仅在renderUI内生成。

library(shiny)

 ui <- shinyUI(fluidPage(
 titlePanel(title = "Use of action/submit button for multiple inputs"), 
 sidebarLayout(

sidebarPanel(numericInput("rows","Input No. of rows",value = 3,min=1),
             br(),
             numericInput("col","Input No. of cols",value = 1,min=1)),

mainPanel(textOutput("display"),
          uiOutput("plo")

)))) 

Server.r

server <- function(input,output){

# creating input widgets dynamically
output$plo <- renderUI({
z <- input$col

lapply(seq(input$col), function(j){
  column(width=3,

         lapply(seq(input$rows),function(i){
           numericInput(inputId = paste0("range",paste0(i,j)),label = j,value = paste0(i,j))  

         })
       )
    })
})

# capturing the value of input widgets in a matrix
cm <-  reactive({
    c <- input$col
    r <- input$rows

   changed_m <- matrix(nrow = r,ncol = c)

      lapply(seq(input$col), function(j){
        lapply(seq(input$rows),function(i){
          changed_m[i,j] <<- input[[paste0("range",paste0(i,j))]]  
         })
      })
      changed_m
  }) 

# display the sum
output$display <- renderText({
     paste0("Sum of matrix:   ",sum(cm()))
})
} 

1 个答案:

答案 0 :(得分:2)

以下是可能解决方案的工作示例。您可以在reactiveVal中存储要显示的字符串(或者只是当然的总和),并且仅在用户单击按钮时更新此字符串,或者在其中一个输入发生更改时显示备用文本,以便用户知道总和不再正确。

希望这有帮助!

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel(title = "Use of action/submit button for multiple inputs"), 
  sidebarLayout(

    sidebarPanel(numericInput("rows","Input No. of rows",value = 3,min=1),
                 br(),
                 numericInput("col","Input No. of cols",value = 1,min=1),
                 actionButton('update' ,'update!')),

    mainPanel(textOutput("display"),
              uiOutput("plo")

    )))) 

server <- function(input,output){

  # creating input widgets dynamically
  output$plo <- renderUI({
    z <- input$col

    lapply(seq(input$col), function(j){
      column(width=3,
             lapply(seq(input$rows),function(i){
               numericInput(inputId = paste0("range",paste0(i,j)),label = j,value = paste0(i,j))  
             })
      )
    })
  })

  # capturing the value of input widgets in a matrix
  cm <-  reactive({
    c <- input$col
    r <- input$rows

    changed_m <- matrix(nrow = r,ncol = c)
    lapply(seq(input$col), function(j){
      lapply(seq(input$rows),function(i){
        x=input[[paste0("range",paste0(i,j))]]
        changed_m[i,j] <<- ifelse(!is.null(x),x,0)
      })
    })
    changed_m
  }) 

  # initialize our reactiveVal with an empty string
  my_sum <- reactiveVal('')

  # observer that listens to the button click, then updates the sum string.
  observeEvent(input$update,{
                 my_sum(paste0("Sum of matrix:   ",sum(cm())))
               })

  # observer that listens to changes in the input, then updates the sum string.
  observeEvent(cm(),ignoreNULL = T,ignoreInit = T, {
    isolate(my_sum('invalidated. Press button to update.'))
  })

  # display the sum string
  output$display <- renderText({
    my_sum()
  })
} 

shinyApp(ui,server)