2017-07-19 8 views
0

アップロードされたデータを読み込んで、カラム内のユニークエレメントの数(カラムの名前はBig)のために十分なnumericInputを配置するアプリを作成したいと思います。この質問here私を助けた。光沢のある入力ウィジェットの動的数

コードは以下の通りです:

library(shiny) 
ui <- fluidPage(
    fileInput(inputId = "up","", accept = '.csv'), 
    uiOutput("sliders") 
) 

server <- function(input, output, session) { 

    INPUT <- reactive({ 
    infile <- input$up 

    #validate(need(input$up, "Input a valid filepath."))  

    read.csv(infile$datapath, header = TRUE, sep = ",") 
    }) 

inVars <- reactive({ 
    unique(INPUT()$Big) 
    }) 

    output$sliders <- renderUI({ 
    pvars <- length(inVars()) 
    lapply(seq(pvars), function(i) { 
     numericInput(inputId = paste0("range", pvars[i]),label = pvars[i],value = 1) 
    }) 
    }) 

} 

shinyApp(ui = ui, server = server) 

3つの質問:私はvalidate

if (is.null(infile)) 
return(NULL) 

代わりに入れ

1.、それは私のように見えるエラーになりますこれは:

missing value where TRUE/FALSE needed

このエラーを取り除くにはどうすればよいですか?

2.numericInputのそれぞれにラベルを追加するにはどうすればよいですか?

3.入力値は後でどのように使用できますか? reactive環境では?

問題がif (is.null(infile))文ではなく、感謝

答えて

0

、それはlapply機能付きです。シャイニーアプリが起動したばかりで、の全機能が実行され、inVars()の長さは0seq(pvars)の順番は10となります。 が0に等しい場合、への参照を作成しているため、numericInputは失敗します。

以下は、問題を解決するコードであり、あなたの質問にも答えています。

library(shiny) 
ui <- fluidPage(
    fileInput(inputId = "up","", accept = '.csv'), 
    uiOutput("sliders") 
) 

server <- function(input, output, session) { 

    INPUT <- reactive({ 
    infile <- input$up 
    if (is.null(infile)) 
     return(NULL) 
    read.csv(infile$datapath, header = TRUE, sep = ",") 
    }) 

inVars <- reactive({ 
    unique(INPUT()$Big) 
    }) 

    output$sliders <- renderUI({ 
    pvars <- length(inVars()) 
    if (pvars > 0) { 
     div(
     lapply(seq(pvars), function(i) { 
      numericInput(inputId = paste0("range", inVars()[i]),label = inVars()[i],value = 1) 
     }), 
     actionButton("getValues", "Get values"), 
     tableOutput('table') 
    ) 
    } 
    }) 

    values <- 0 

    # get the values of each numericInput and store them in "values" 
    observeEvent(input$getValues, { 
     # initialize vector 
     values <<- rep(NA, length(inVars())) 
     names(values) <<- inVars() 

     for(k in 1:length(inVars())) { 
     inputName <- paste0("range", inVars()[k]) 
     # only get a value if the numeric input exists 
     if (!is.null(inputName)) 
      values[[k]] <<- input[[inputName]] 
     } 
    # show values as a table 
    output$table <- renderTable(data.frame(
         variable = inVars(), 
         values)) 

    }) 

} 

shinyApp(ui = ui, server = server) 

更新:

のような、コードをテストするコンテンツと.csvファイルを使用するには:

num,Big 
1,a 
2,a 
3,b 
4,b 
5,c 
6,c 
7,d 
8,d 

はスクリーンショット:

Screenshot

+0

これは動作しません。 。私は 'ui'に' dataTableOutput( "table") 'を追加しましたが、まだ動作していません。また、アクションボタンを使わずに自動的に値を読みたいと思っています。 –

+0

'tableOutput'で動作するはずです。テスト用の入力データとスクリーンショットの解答を更新しました。最後のバージョンのShinyを確認してください。値を自動的に読み取る場合は、https://stackoverflow.com/a/40643541/4322318 – Geovany

+0

で解決策を確認できます。コードに問題が1つありますが、わかりません。 'd 'の値を変更すると、' c'の値が変更されます。異なるデータセットで初めてコードを実行したとき、「引数が異なる行数を意味する:4,5」というエラーが発生しました。 'observeEvent'の内部で何かが間違っているようです。 –

関連する問題