你如何计算从Shiny的textInput框中获取的数据?

时间:2016-03-23 16:11:25

标签: r shiny

ui code:

===

library(shiny)

  shinyUI(

    # Use a fluid Bootstrap layout
    fluidPage(    


      # Generate a row with a sidebar
      sidebarLayout(      


        # Define the sidebar with one input
        sidebarPanel(
          sliderInput("capacity", "Current Capacity:", 
                      min=0, max=100, value=10),
          c(list(
            textInput("service", "Service Component Name", ""),
            actionButton("addbtn", "Add Component"))),
            #lapply(seq(10), function(i) uiOutput(paste0("ui", i)))

            br(),
            br(), 
            br(),
            br(),
            br(),
          actionButton("calcbtn", "Calculate Projection")




        ),



        # Create a spot for the barplot
        mainPanel(
          textInput("inputWork","Volume", width="200px"),
          textInput("inputGrowth","Growth Rate", width="100px"),
          lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
          #tags$p("Web"),
          #verbatimTextOutput("input_type_text")

        )

      )
    )
  )

服务器代码:

   server <- function(input, output) 
{
  observeEvent(input$addbtn, {
    n <- isolate(input$addbtn)
    if (n == 0) return()

    # create n-th pair of text input and output
    output[[paste0("ui", n)]] <- renderUI(
      list(textInput(paste0("textin", n), isolate(input$service)),
           textOutput(paste0("textout", n))))

    # display something in the output
    output[[paste0("textout", n)]] <- renderText({
      work<-as.numeric(input$inputWork)
      growth<-as.numeric(input$inputGrowth)
      print(growth)


     #paste("projection", (100+growth)*as.numeric(input[[paste0("textin", n)]]))
    })
  })
  observeEvent(input$calcbtn, {
    n <- isolate(input$calcbtn)
    if (n == 0) return()

    output[[paste0("textout", n)]] <- renderText({
      work<-as.numeric(input$inputWork)
      growth<-as.numeric(input$inputGrowth)
      project<-growth+as.numeric(input$service)

      print(growth)
      print(project)

      paste("projection", ((1+growth/100)*as.numeric(input[[paste0("textin", n)]])))
    })
  })
}

这就是我想要做的。此代码将具有初始文本框和提交按钮。用户在第一个输入文本中放置一个文本,单击提交按钮,在主面板中生成一个新文本。用户可以多次执行此操作以在主面板中创建多个textInput框。

我还在主面板顶部有一个静态的另一个inputText框标记为Workload。

所以,这就是我想要做的事情:

  1. 用户将在工作负载textIntut中插入数据(需要数字)。
  2. 用户将数据插入到其他动态生成的textInput框中(所有文本都需要为数字)。
  3. 我将从工作负载和所有其他文本框中获取值,进行一些计算和投影,并在每个动态生成的textInput框旁边显示数据,如果我可以在生成的文本框旁边插入文本框以显示我的输出,那将会很棒
  4. 例如,我的工作量中有数据,我已生成Web_server,App_server textInput框。我将从工作负载中获取数据并通过web_server中的数据进行分配,并将其显示在web_server textInput框旁边(在文本框中显示数据),对app_server textInput框执行相同的操作。

    我有什么想法可以做到闪亮吗?这是我想要完成的形象。给定用户的工作量增长率和用户输入部分的其他输入,我将不得不计算并填充相应的文本框。

2 个答案:

答案 0 :(得分:2)

以下代码实现:

  1. 单击按钮时添加文本输入(和输出)(最多10个)。
  2. 每个文本输出都使用输入信息显示一些消息。
  3. 注意:

    • 文本输出显示在输入的下方,而不是旁边。这更多是关于设计问题。我不熟悉HTML或CSS,抱歉。
    • 这根本没有计算。您可以根据需要添加更多组件并更改renderText的内容。
    • 我使用textOutput来显示计算结果,但您的意图可能是使用textInput。通常,您应该使用textOutput来显示内容,尽管可以像输出一样使用输入对象。
    • 我使用textInput,但如果输入应始终为数字,则可以使用numericInput作为评论之一。

    玩得开心。

    library(shiny)
    
    ui <- c(list(
      textInput("service", "Service Component Name", ""),
      actionButton("addbtn", "add")),
      lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
    )
    
    
    server <- function(input, output) 
    {
      observeEvent(input$addbtn, {
        n <- input$addbtn
        if (n == 0) return()
        if (n > 10) return()
    
        # create n-th pair of text input and output
        output[[paste0("ui", n)]] <- renderUI(
          list(textInput(paste0("textin", n), isolate(input$service)),
               textOutput(paste0("textout", n))))
    
        # display something in the output
        output[[paste0("textout", n)]] <- renderText({
          paste("you wrote", input[[paste0("textin", n)]])
        })
      })
    }
    
    runApp(list(ui = ui, server = server))
    

答案 1 :(得分:1)

实现您的愿望的一些提示是:

  • renderText正在检查其组件的更改,并在修改组件的值时执行。这就是input$textin1的原因,在文本输入中输入内容后立即进行更新。
  • isolate阻止组件触发执行。使用isolate(input$textin1)时,修改文本输入不会更新textOutput
  • 要触发执行renderText的按钮,您只需在renderText内添加按钮即可。在内部,单击按钮时,其值会递增。因此,它是函数正在检查的组件的值修订,执行发生。
  • 最后,您需要对所有textin1textin2,...
  • 执行此操作

以下代码实现了这一点。检查与上一个答案的区别。

library(shiny)

ui <- c(list(
  textInput("service", "Service Component Name", ""),
  actionButton("addbtn", "add"), 
  actionButton("calcbtn", "calc")),
  lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
)


server <- function(input, output) 
{
  observeEvent(input$addbtn, {
    n <- input$addbtn
    if (n == 0) return()
    if (n > 10) return()

    # create n-th pair of text input and output
    output[[paste0("ui", n)]] <- renderUI(
      list(textInput(paste0("textin", n), isolate(input$service)),
           textOutput(paste0("textout", n))))

    # display something in the output
    output[[paste0("textout", n)]] <- renderText({
      input$calcbtn
      paste("you wrote", isolate(input[[paste0("textin", n)]]))
    })
  })
}

runApp(list(ui = ui, server = server))