2016-08-23 28 views
0

私はウィジェットで選択した列の数を変えてデータ出力を大きくしました。列を動的に右揃えしたいのですが、列数が固定されている場合にのみ解決策が見つかりました。私はtarget =コマンドでリファレンスを調整して動的にすることができればと思っていました。何とかこれは動作しませんし、列の数がデフォルトの参照よりも小さい場合、私は出力を得ません。私は、反応性のあるステートメントがデータテーブルオプションを動作させないところを読んでいます。私はMWEを付けました。DTデータテーブルの動的な列の整列

rm(list=ls()) 
library(shiny) 
library(datasets) 
library(datatable) 
DT<-data.table(matrix(abs(rnorm(100,sd=100000)),nrow=10)) 


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

    # Return the requested dataset 
    columns <- reactive({ 
    switch(input$columns, 
     all= c("V1","V2","V3","V4","V5","V6","V7","V8","V9","V10"), 
     left= c("V1","V2","V3","V4","V5"), 
     right= c("V6","V7","V8","V9","V10")) 
      }) 


    # Show table 
    output$view <- DT::renderDataTable(
    format(DT[,.SD,.SDcols=columns()],digits = 0,scientific=F), 
     option=list(columnDefs=list(list(targets=0:(length(columns())-1), class="dt-right"))) 
) 
}) 
    library(shiny) 

# Define UI for dataset viewer application 
ui<-shinyUI(fluidPage(

    # Application title 
    titlePanel("Shiny Text"), 

    # Sidebar with controls to select a dataset and specify the 
    # number of observations to view 
    sidebarLayout(
    sidebarPanel(
    selectInput("columns", label = h3("Select Columns"), 
        choices = list("All columns" = "all", "Left side" = "left", 
            "Right side" = "right"), selected = "all") 
    ), 

    # Show a summary of the dataset and an HTML table with the 
    # requested number of observations 
    mainPanel(
     DT::dataTableOutput("view") 
    ) 
) 
)) 



runApp(list(ui=ui,server=server)) 

答えて

1

DataTableのオプションは、テーブル全体を再描画せずにオプションを変更することはできませんという意味では反応しないが、あなたは、テーブルを再描画するために喜んでいる場合、それは問題ではありません下記を参照してください。

あなたがこのようにサーバーの機能を変更した場合

は、それが動作するはずです:私はcolumns()に応答し、正しいcolumnDefでテーブルを再描画反応datatableを作成してい

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

    # Return the requested dataset 
    columns <- reactive({ 
    switch(input$columns, 
      all= c("V1","V2","V3","V4","V5","V6","V7","V8","V9","V10"), 
      left= c("V1","V2","V3","V4","V5"), 
      right= c("V6","V7","V8","V9","V10")) 
    }) 

    # reactive datatable 

    rdt <- reactive({ 
    DT::datatable(format(DT[,.SD,.SDcols=columns()],digits=0,scientific=FALSE), 
        option=list(columnDefs=list(
        list(targets=seq_len(length(columns()))-1, 
         class="dt-right")))) 
    }) 


    # Show table 
    output$view <- DT::renderDataTable(
    rdt() 
    ) 

}) 

。多くのデータがあった場合、これは非常に遅いでしょう。

+0

Thxが役に立ったので、私はrenderDataTable()コマンドでreactiveを使ってみましたが、動作しませんでした。また、ターゲットに対してseq()コマンドを使用することをお勧めします。これがデータセット全体では遅すぎるかどうかはわかりますが、唯一の9000行と<30列です。 –

関連する問題