2016-03-23 87 views
4

UI代码:如何计算Shiny中textInput框中的数据?

===

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)]]))) 
    }) 
    }) 
} 

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

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

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

  1. 用户将插入工作量textIntut数据(它需要的数字)。
  2. 用户将数据插入到其他动态生成的textInput框(全部需要是数字)。
  3. 我将从工作负载和所有其他文本框中获取值,执行一些计算和预测,并在每个动态生成的textInput框旁边显示数据,如果我可以在旁边插入文本框生成以显示我的输出。

例如,我在我的工作负载中有数据,我已经生成了Web_server,App_server textInput框。我将从工作负载中提取数据,并根据web_server中的数据进行分类,并将其显示在web_server textInput框(在文本框中显示数据)旁边,对app_server textInput框执行相同操作。

任何想法,我怎么可以做到这一点闪亮?这是我想要完成的图像。考虑到从用户输入的工作负载增长率以及来自用户输入部分的其他输入,我将不得不计算并填充各个文本框。下面

+0

如果您所说的数据是单个数字,则应该使用'numericInput'。否则,您需要在服务器代码中进行一些验证和转换(将字符串转换为数字) –

+0

有两个问题。 (1)你知道动态创建的输入框的最大数量吗?或者您需要接受用户想要的多少? (2)您能否显示一个示例UI来显示计算结果?这将是textOutput关联的textInput? –

+0

1)没有最大数量的文本框,它可以与用户输入一样多。 2)是,与textInput关联的textOutput。他们可以并排吗? – user1471980

回答

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)) 
2

的代码实现:

  1. 添加文本输入(和输出),当按钮被点击(最多10个)。
  2. 每个文本输出都使用输入信息显示一些消息。

注:

  • 文本输出下面出现,而不是旁边,输入。这更多关于设计问题。对于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)) 
+0

对不起,我忘了提。输出需要通过命令按钮生成。一旦所有输入到位,用户需要能够按下一个提交按钮并且输出框将被填充。你能修改这个,我从那里拿走它。再次感谢!!! – user1471980

+0

还有一个按钮来清除所有字段而不刷新页面? – user1471980

+0

[这里](http://stackoverflow.com/questions/24265980/reset-inputs-button-in-shiny-app)是一种清除所有字段的方法 – Zediiiii

相关问题