2016-03-23 7 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)]]))) 
    }) 
    }) 
} 

これは私がやろうとしていますものです。このコードには、最初のテキストボックスと送信ボタンがあります。ユーザーは、最初の入力テキストにテキストを入力し、サブミット・ボタンをクリックします。メイン・パネルに新しいテキストが生成されます。ユーザーはこれを複数回実行して、メインパネルに複数のtextInputボックスを作成することができます。

また、メインパネルの上にワークロードという名前の静的な別のinputTextボックスがあります。

だから、これは私がしようとしているものです:

  1. ユーザーは、(それが数値に必要)ワークロードtextIntutにデータを挿入します。
  2. ユーザは、動的に生成される他のテキスト入力ボックスにデータを挿入します(すべて数字でなければなりません)。
  3. ワークロードと他のすべてのテキストボックスから値を取得し、計算と投影を行い、動的に生成されたtextInputボックスの横にデータを表示します。出力を表示するためにテキストボックスを挿入するといいでしょう。

たとえば、ワークロードにデータがあり、Web_server、App_server textInputボックスが生成されています。ワークロードからデータを取り出し、web_serverのデータで除外し、web_serverのtextInputボックスの隣に表示する(テキストボックスにデータを表示する)場合は、app_serverのtextInputボックスでも同じ操作を行います。

どのように私は光沢の中でこれを行うことができますか?これは私が達成しようとしているイメージです。ユーザーから取得したワークロードの増加率とユーザー入力セクションからの他の入力を考慮すると、それぞれのテキストボックスを計算して入力する必要があります。

+0

あなたが言ったデータが単一の数値である場合は、「numericInput」を使用する必要があります。それ以外の場合は、サーバーコードで検証と変換を行う必要があります(文字列から数値への変換) –

+0

2つの質問。 (1)動的に作成される入力ボックスの最大数を知っていますか?または、ユーザーが望む数だけ受け入れる必要がありますか? (2)計算結果をどのように表示するかのUI例を表示できますか?それはtextOutputに関連付けられたtextInputですか? –

+0

1)最大数のテキストボックスはありません。ユーザー入力と同じ数にすることができます。 2)はい、textInputはtextInputに関連付けられています。彼らは並んでいることができますか? – 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

以下のコードを実装:ボタンを(10まで)クリックされたとき

  1. は、テキスト入力(および出力)を追加します。
  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

[Here](http://stackoverflow.com/questions/24265980/reset-inputs-button-in-shiny-app)は、すべてのフィールドをクリアする手段です。 – Zediiiii

関連する問題