2016-02-22 87 views
0

我試圖找出我怎麼能得到從被動SQL查詢的數據後更改列的類型......[R閃亮:從SQL查詢格式反應data.frame

例如,當我獲取數據從數據庫中,一些列是字符,我希望它們是因素。有些列是數字(這是正確的),但我需要它們作爲數據表中的因子顯示(用於數據表中,因爲列名爲Tolerance,並且容差不能按範圍過濾,所以它應該是一個數)。

簡單代碼:

library(ROracle) 
library(shiny) 
library(DT) 


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

    con <- dbConnect(dbDriver("Oracle"),"xx/K",username="user",password="pwd") 
    tableList <- dbListTables(con,schema="K") 

    updateSelectizeInput(session, "tabnames", server = TRUE, choices = tableList) 

     sqlOutput <- reactive({ 
     sqlInput <- paste("select rownum * from K.",input$tabnames) 
     dbGetQuery(con$cc, sqlInput, stringsAsFactors = T)#it hasnt worked neither 
     }) 

    output$table <- DT::renderDataTable(sqlOutput(), server=TRUE, rownames=TRUE, filter="top", options=list(pageLength=10)) 

    session$onSessionEnded(function() { dbDisconnect(con) }) 
    }) 

ui_panel <- 
    tabPanel("Test", 
      sidebarLayout(
      sidebarPanel( 
      ), 
      mainPanel(
       selectizeInput("tabnames",label = "server side", choices = NULL), 

       tableOutput("out"), 
       tableOutput("table") 
      ) 
      ) 
) 


ui <- shinyUI(navbarPage("Test",ui_panel)) 

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

當我試圖簡單地說:

output$table <- DT::renderDataTable({ 

sqlOutput()$HOEHE_TOLP <- as.factor(sqlOutput()$HOEHE_TOLP) 

datatable(sqlOutput(), server=TRUE, rownames=TRUE, filter="top", options=list(pageLength=10))}) 

它沒有工作,並給了我一個錯誤:

Error in sqlOutput()$HOEHE_TOLP <- as.factor(sqlOutput()$HOEHE_TOLP) : 
    ungültige (NULL) linke Seite in Zuweisung 

* invalid (NULL) left side of assignment

任何想法如何我可以將一些列轉換爲響應數據框架的因素?

乾杯

+0

您可以將數據幀本地保存在反應函數中,然後在需要的列上調用as.factor()。 – Gopala

+0

這可能會很棘手,因爲會有很多用戶在使用應用程序,其次是過濾後的數據會很大...... –

+0

不確定你的意思,因爲保存並返回數據幀到一個變量與被動回報(一個數據框)沒有什麼不同。 – Gopala

回答

1

編輯:

只需更換此表達式:

output$table <- DT::renderDataTable(sqlOutput(), server=TRUE, 
    rownames=TRUE, filter="top", options=list(pageLength=10)) 

隨着:

output$table <- DT::renderDataTable({ 
    intermed <- sqlOutput() 
    intermed$HOEHE_TOLP <- as.factor(intermed$HOEHE_TOLP) 
    datatable(intermed) %>% formatStyle("RUND2_MITT", color = 'red', 
    backgroundColor = 'lightyellow', fontWeight = 'bold') 
}, server=TRUE, rownames=TRUE, filter="top", options=list(pageLength=10)) 

這裏是一個自包含例如:

library(DT) 
library(shiny) 

ui <- fluidPage(
    actionButton("inst", "Instigate Reactive"), 
    dataTableOutput("test") 
) 

server <- function(input, output){ 
    data <- eventReactive(input$inst, { 
    iris 
    }) 

    output$test <- renderDataTable({ 
    set <- data() 
    set$Sepal.Length <- as.factor(set$Sepal.Length) 
    datatable(set) %>% formatStyle("Petal.Length", color = 'red', 
            backgroundColor = 'lightyellow', 
            fontWeight = 'bold') 
    }) 
} 

shinyApp(ui, server) 
+0

非常感謝!它工作完美,但只是一件事:當我使用'%>%formatStyle(「RUND2_MITT」,color ='red',backgroundColor ='lightyellow',fontWeight ='bold')'給了我一個錯誤:錯誤appendFormatter(x $ options $ rowCallback,columns,colnames,rownames,: 你指定了列:RUND2_MITT,但是數據的列名是'。你知道我可以如何實現'formatStyle'? –

+0

@Malvina_a請參閱我的編輯 – mlegge