2016-03-23 58 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

相關問題