Rshiny中输入文本的意外值

时间:2015-07-30 20:12:55

标签: r shiny

我正在创建一个应用程序,它从滑块中获取输入以创建匹配数量的输入文本框。但是,当我从输入框打印值时,它并不总是更新。

实施例: 在滑块输入上选择3。将1,2,3分别放入3个文本框中。提交。打印数量= 1数字= 2数字= 3.当我将滑块移动到2并按Enter键时,我得到数字= 1数字= 2,尽管文本输入中没有值。如果我将滑块移动到4,我将得到输出数= NA数= NA数= 3数= NA。

显然它记住以前的输入值,但我无法理解为什么或如何解决它。

ui.R
shinyUI(fluidPage(
  fluidRow(
  column(4, wellPanel(
    sliderInput("numObs", "Number of observations", 1, 30, 3),
    uiOutput("buttons"),
    submitButton(text = "Apply Changes", icon = NULL)
)),
column(8,
       textOutput("a")
)

) ))

server.R
shinyServer(function(input, output) {
  output$buttons <- renderUI({
    obs <- input$"numObs";
    objs <-list();
    for (i in 1:obs ){
      objs <- list(objs, numericInput(inputId = paste0("t", i), "Day:", NA),br());
    }        
  objs <- fluidRow(objs);
  })

  t<- function(){
    for(i in 1:input$"numObs"){
      if(i ==1){
        t <- c(as.numeric(input[[paste0("t",i)]])[1]);
      }
      else{
        t <- c(t,as.numeric(input[[paste0("t",i)]])[1]);
      }
    }
    return(t);
  }

  output$a<- renderText({
  paste("number = ", t());
  })
})

1 个答案:

答案 0 :(得分:0)

我做了一些更改,并为您的代码介绍了一些内容。使用actionButtonsubmitButton更好,因为它更灵活。如果您不喜欢actionButton的样式,请查看Shiny Themes

rm(list = ls())
library(shiny)

ui =(fluidPage(
  fluidRow(
    column(4, wellPanel(
      sliderInput("numObs", "Number of observations", 1, 30, 3),
      uiOutput("buttons"),
      actionButton("goButton", "Apply Changes")
    )),
    column(8,textOutput("a"))
  ) ))

server = (function(input, output) {

  output$buttons <- renderUI({
    obs <- input$"numObs";
    objs <-list();
    for (i in 1:obs ){
      objs <- list(objs, numericInput(inputId = paste0("t", i), "Day:", NA),br());
    }        
    objs <- fluidRow(objs);
  })

# keep track if the Number of obseervations change
  previous <- eventReactive(input$goButton, {
    input$numObs
  })

  t <- eventReactive(input$goButton, {

    for(i in 1:input$"numObs"){
      if(i ==1){
        t <- c(as.numeric(input[[paste0("t",i)]])[1]);
      }
      else{
        t <- c(t,as.numeric(input[[paste0("t",i)]])[1]);
      }
    }
    return(t)
  })

  output$a<- renderText({
    if(previous() != input$numObs){
      return()
    }
    paste("number = ", t());
  })
})
runApp(list(ui = ui, server = server))