2016-07-26 2 views
2

値sliderInputに基づいてデータをサブセット化する以外の何もしないリアクティブ関数(datasplit)があります。 私の2番目のリアクティブ関数(selectedData)は、最初のリアクティブ関数からサブセットデータを取り出し、SelectInputに基づいて列を再度フィルタリングする必要があります。リアクティブ関数間でデータを渡す - Shiny R

最後にこのデータに基づいてクラスタリングします。

SelectInputから入力を受け取りますが、最初はリアクティブ関数では機能しません。

ありがとうございました。私はデータをアップロードできませんが、私の輝くコードを参照してください。

シャイニーコード:

 library(shiny) 
     ui <- fluidPage(
      selectInput("xcol", "X Variable", names(data[,c(2)])), 
      selectInput("ycol", "Y Variable", names(data[,c(1)])), 
      sliderInput(inputId = "cost", 
         label = "Kosten", 
         value = 1000, min = 1, max = 5000), 
      sliderInput(inputId = "count", 
         label = "Anzahl Fälle", 
         value = 500, min = 1, max = 2000), 
      numericInput("clusters", "Anzahl Cluster", 3, min=1, max= 9), 
      plotOutput(outputId = "plot1") 

     ) 

     server <- function(input, output){ 
      DealerDF <- read.csv(file = "dealer_category.csv",header = T) 
      data <- DealerDF 

      datasplit <- reactive({ 
      subset(data, input$xcol() < input$cost() & input$ycol() < input$count()) 


      }) 


      selectedData <- reactive({ 
      #this seems to be not working 
      datasplit()[, c(input$xcol(), input$ycol())] 
      }) 

      clusters <- reactive({ 
      kmeans(selectedData(), input$clusters) 
      }) 

      output$plot1 <- renderPlot({ 

      if (!is.null(selectedData())) { 
       par(mar= c(5.1, 4.1,0,1)) 
       plot(selectedData(), 
        col= clusters()$cluster, 
        pch= 20, cex=3) 
       points(clusters()$centers, pch=4, cex=4, lwd=4) 
      } 
      }) 

     } 

     shinyApp(ui = ui, server = server) 

データ:

 cnt av_cst 
     479 2.359.695 
     479 83.439 
     475 891.863 
     474 2.496.681 
     474 97.654 
     474 821.163 
     473 1.650.016 
     473 143.724 
     472 90.398 
     470 98.745 
     468 681.947 
     468 97.392 
     467 435.477 
     467 97.657 
     466 160.547 
     463 98.454 
     30 24.936 
     30 29.432 
     30 1.599.577 
     30 227.073 
     30 227.887 
     30 187.147 
     30 89.697 
     30 615.427 
     30 32.398 
     30 15.133 
     30 24.445.753 
     30 25.944 
     30 344.933 
     30 10.237 
     30 15.86 
     17082 30.425 
     11358 75.541 
     9788 30.638 
     9667 30.381 
     7302 73.051 
     6849 1.009.921 
     6299 124.441 
     6018 30.158 
     5646 124.569 
     5383 1.133.911 
     5381 30.278 
     4357 123.213 
     3989 3.065 
+0

外の関数kmeans計算を移動することを検討可能性があります'? –

+0

@PorkChopデータは25列のデータフレームです – user3560220

+0

データを入力してください –

答えて

0

私は、次のコードをテストすることができなかったデータを持っていないので。さらに、私はあなたの入力(input $ col)を関数(input $ col())として扱っている理由を理解できませんでした。私はこのネストされたサブセットを何度も実装しました。複数のフィルタを追加できます。あなたのサブセット機能はグリッチなしで動作することを期待して、次のように役立ちます:

DealerDF <- read.csv(file = "dealer_category.csv",header = T) 
      data <- reactive({ 
       DealerDF 
      }) 

      datasplit <- reactive({ 
      IstSubset <- subset(data(), input$xcol() < input$cost() & input$ycol() < input$count()) 
      selectedData <- IstSubset[,c(input$xcol(), input$ycol())] 
      clusters <- kmeans(selectedData, input$clusters) 
      clusters 
      }) 


      output$plot1 <- renderPlot({ 
      if (!is.null(dataSplit())) { 
       par(mar= c(5.1, 4.1,0,1)) 
       plot(datasplit(), 
        col= clusters()$cluster, 
        pch= 20, cex=3) 
       points(clusters()$centers, pch=4, cex=4, lwd=4) 
      } 
      }) 

あなたはプロット出力を取得しない場合は、 `データが何であるかを反応ループ

+0

私はあなたの方法を試しました。それでも失敗します。私が見る唯一の問題は、サブセット関数doestはUIからの入力関数で動作することです。サンプルデータで質問を更新しました。あなたもそれをすることができます。私は列をハードコードする場合、それは動作しますが、UIから取るようにすると失敗します。 – user3560220

+0

あなたのデータの小さなセットを投稿するために、dput関数を使用できますか?3-4行 – Apricot

+0

、ありがとう問題を解決する。私はすでに質問にデータがあります。 2つの列(cnt、av_cst)は、クラスタリングに使用されます。リンクをアップロードして送信しますか? – user3560220

関連する問題