2016-07-07 7 views
2

これは、他の場所にプロットされている値の上または下の10を示すサマリーブロックのモックアップです。光沢のあるリアクティブドロップダウン(数値入力による)

ISSUE

変数名を変更したり、ソート方向が正常に動作しているが、データが示すためにどのくらいの制限(​​)を変更、作品最初は10を示したが、へレス5のようにそれを変える示す終わりますすべてのデータより高い値に変更すると機能することがありますそれは非常に奇妙です!

のでOK

Deafult app on startup

OK未

それはのサブセットに問題App when choose 5

CODE

library(shiny) 
library(data.table) 

dataset1 <- as.data.table(iris) 

server <- function(input, output) { 
# Top table 
    datatop1 <- reactive({ 

    dt <- copy(dataset1) 
    setorderv(dt,input$t1, input$sort1) # -1 is descending 

    # choose subset of rows 
    row.limit <- min(nrow(dataset1), input$limit1) 
    dt <- dt[1:row.limit, ] 

    # choose columns 
    dt <- dt[, .(Species, get(input$t1))] 
    setnames(dt,"V2",input$t1) 

    return(dt) 
    }) 

    output$top1 <- renderUI({ 
    if(!is.null(dataset1)) { 

     fluidRow(inputPanel(
     selectInput("limit1", "Limit:", 
        c("5", "10", "15", "20", "25", "50"), 
        selected = "10"), 
     selectInput(("t1"), "Variable:", choices = names(dataset1), 
        selected = "Sepal.Length"), 
     selectInput("sort1", "Sort by:", 
        choices = c('Bottom/Asc.' = +1 , 'Top/Desc.' = -1), 
        selected = -1) 
    )) 
    } 
    }) 


    # Top panel 
    output$screenTop1 <- renderTable({  
    # top dataset is in reactive as function 
    datatop1() 
    }) 
    output$screenTop <- renderUI({ 
    tagList(
     uiOutput("top1"), 
     uiOutput("screenTop1") 
    ) 
    }) 
} 

ui <- shinyUI(
    fluidPage(tabPanel("Top", uiOutput("screenTop")) 
) 
) 

shinyApp(ui=ui, server = server) 

です?それとも私は反応的な方法を使っていますか?光沢のあるエキスパート - 私が間違っていることや、まだ反応性を完全には把握していないので、私は何をやっているのか、感謝します。メインコードは別のファイル構造の中にあるので、コードはちょっと複雑です。

> sessionInfo() 
R version 3.2.4 Revised (2016-03-16 r70336) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.9.6 shiny_0.13.2 

EDIT:以下の説明

@Porkチョップの偉大なコメントはminが文字にすべてを強要終わることができていることを説明しています。したがって、226と5に直面したとき、それは226と5のテストになり、要素ごとに2の値が "5"になるので、最小値として226が選択され、すべての行が表示されます。

しかし、10と20の間は、そうではありませんでした。 "226"と "10"の最初の数字1 < 2.正確な最小値が示されました。 レッスン:腕時計タイプで、必要に応じてSelectInput入力$ varsをas.numericに設定してください。

謎解説!

答えて

4

ようなものだと、あなたのサブセットを更新します。

row.limit <- min(nrow(dataset1), as.numeric(input$limit1))

編集:

1)minminを計算するnumeric変数を必要として適切に使用するには、データ型を修正するためにcastに必要:as.numeric(input$limit1)、それ以外の数値変数は

デフォルトでは

2)selectInput()selectizeInput()JavaScriptライブラリselectize.js

3を使用するようselectinputは、タイプstringである)あなたが"Selectize is instantiated from a <input type="text"> element"

は、あなたの開発に今後もいることがわかりますselectize documentation読めば、私はあなたをお勧めしますvalidateneedを可能な限り使用するには、hereのドキュメントを参照してください。また、文字列の分を取って明確にするためにprint同じくらい

することができますよう

を使用しよう:

あなたが?minを入力する場合は、文字列の評価があることがわかりますすることは、次のとおりです。

  • 文字列がコレクションに存在する場合は、セット全体をタイプcharacter
  • に強制します。min文字列のソートはアルファベット順を意味し、Lexicographical orderを使用して行われ、これはあなたがmin(c("10",2))を取るならば、それは22後は、文字列にcoercedである前に1として"10"が来る返すことを意味
  • 私は心配していた
+0

ありがとうございました。 **これは私が半日狂ってしまったため、あなたの答えに**理由を説明できますか?あなたは常に入力変数の型をチェックする必要がありますか?いつあなたは必要ですか? – micstr

+0

エクストラとヒントのおかげでPorkChopに感謝します。私は 'print'を使用して、それが時々分として226で戻ってくるのを見て驚いた。どのように文字列がいくつかの時間に変換され、いつもウィッグをしていない奇妙。 – micstr

+1

多くの偉大なプログラマーが何よりもデータ型に多くの注意を払っていることに注意してください。 –

1

あなたはこの試みることができます:

# choose subset of rows 
    #row.limit <- min(nrow(dataset1), input$limit1) 
    dt <- dt[1:input$limit1, ] 

それはrow.limitを "計算" する必要ありませんですが。番号として、それを直接含めることができます。それはdt[1:5, ]

+1

ロードされたデータが選択された行よりも小さい場合、データのリサイクル。つまり、データセットには33個のアイテムがあり、ビュー50を選択しますか?あなたは以下の空白で終わります。 'input $ limit1'の変更が' row.limit'を再計算せず、代わりにすべてを選択する理由は何ですか? – micstr

+0

良い点。最後の問題については、Pork Chopの回答を参照してください。 – Jimbou

関連する問題