2016-02-04 60 views
0

我有一個數據表篩選器的問題。我的數據非常大(> 5000000行),包括一些數字和因子列。 Datatable用於過濾數字列滑塊,如果不是範圍的「步驟」,一切都會很好。 有什麼辦法讓步驟更加精細數據表(DT)閃亮 - >步驟爲滑塊範圍在過濾器

示例代碼:

library(shiny) 
library(DT) 
library(ggplot2) 

x <- as.numeric(1:1000000) 
y <- as.numeric(1:1000000) 
data <- data.frame(x,y) 

shinyApp(
    ui = fluidPage(dataTableOutput('tbl'), 
       plotOutput('plot1')), 
    server = function(input, output) { 
    output$tbl = renderDataTable({ 
     datatable(data, filter = "top", options = list(
     pageLength = 300, lengthMenu = c(100,200,300,400,500,600) 
    )) 
    }) 
    output$plot1 = renderPlot({ 
     filtered_data <- input$tbl_rows_all 
     ggplot(data = filtered_data, aes(x = x,y = y)) + geom_line() 
    }) 
    } 
) 

感謝您的幫助!

乾杯

我可以用JQuery嗎?我發現這個問題在stackoverflow which might be usefull,但我不知道我可以如何實現它到我的數據表。

+0

試圖複製你正在做的事情。你能告訴我你的意思是讓步驟更精細嗎?是情節中的x軸嗎?順便說一句...當我運行腳本時,你的表格不顯示..只顯示圖表。 'Filter =「top」'基本上是一個顯示在表格頂部的搜索框。 – user5249203

+0

嘿,當我運行應用程序時,它顯示了x和y兩個過濾器(點擊它們後滑塊出現)頂部(分別在x和y列名下)的表格。使用滑塊來過濾數據是困難的(只要數據很大),選擇的範圍非常有限,我希望滑塊更精細(使用正常的閃亮小工具,您可以設置步驟值,例如:'sliderInput(「decimal」,「Decimal:」, min = 0,max = 1,value = 0.5,step = 0.1)')。是否可以使用'datatable'中的步驟或至少使滑塊範圍更精細? –

回答

1

可以在DT

1)添加sliderInput每個數值列(在服務器側濾波器不可能使用looplapply

2)subseting

3創建reactive)呈現附加數據

例如

library(shiny) 
library(DT) 
library(ggplot2) 

q <- as.numeric(1:1000) 
w <- as.numeric(1:1000) 
e <- as.numeric(1:1000) 
r <- as.numeric(1:1000) 
t <- as.numeric(1:1000) 
y <- as.numeric(1:1000) 
u <- as.numeric(1:1000) 
i <- as.numeric(1:1000) 
o <- as.numeric(1:1000) 
data <- data.frame(q,w,e,r,t,y,u,i,o) 

shinyApp(
    ui = fluidPage(
    fluidRow(uiOutput("filter_ui")), 
    dataTableOutput('tbl'), 
    plotOutput('plot1') 
), 
    server = function(input, output) { 
    output$filter_ui = renderUI({ 
     lapply(colnames(data),function(i) { 
     column(
      width = round(12/ncol(data),0),sliderInput(
      paste0("s",i),min = min(data[[i]]), 
      max = max(data[[i]]),step = 100 , 
      value = c(min(data[[i]]),max(data[[i]])),label = i 
     ) 
     ) 
     }) 
    }) 
    data_1 = reactive({ 
     data_ = data 
     for (i in colnames(data)) { 
     data_ = data_[data_[[i]] <= input[[paste0("s",i)]][2] & 
         data_[[i]] >= input[[paste0("s",i)]][1],] 
     } 
     data_ 
    }) 

    output$tbl = renderDataTable({ 
     DT::datatable(data_1(), options = list(
     pageLength = 300, lengthMenu = c(100,200,300,400,500,600) 
    )) 
    }) 
    output$plot1 = renderPlot({ 
     ggplot(data = data_1(), aes(x = q,y = w)) + geom_line() 
    }) 
    } 
) 
+0

嘿,謝謝你的建議,但是,我正在使用的ShinyApp更大(具有> 10列滑塊等),所以我很樂意完成它(**如果可能** )在DT端 –

+0

編輯我的變種lapply創建'sliderinput'和更多colums(只繪製兩個第一個) – Batanichek

+0

謝謝,但我真的需要在** datatable方**上做它,這對我來說更方便時刻。我原來的ShinyApp由數據表組成,每列都有過濾器,過濾後數據顯示在少數圖表上(加上用戶選擇x和y軸,更改hist binwidth等等),所以它會是太多的小部件 –