R Блестящее обновление с датой из пакета DT - PullRequest
0 голосов
/ 21 февраля 2019

Я сделал блестящую панель мониторинга, которая подключается к postegreDB и получает значение из таблицы, затем поднабор его, а затем преобразовывает его в широкий формат, используя reshape2.Я хочу обновить значение непосредственно с панели инструментов, а затем вставить их в базу данных.

Я использовал эту ссылку для вдохновения: https://github.com/MangoTheCat/dtdbshiny

Это код, который я сделал:

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

  # Generate reactive values
  rvs <- reactiveValues(
    data = NA,
    dataWide = NA,
    dataSub = NA,
    cdfilTmp = NA,
    cdfilTmp2 = NA,
    dataWideTmp = NA,
    dbdata = NA, 
    dataSame = TRUE, 
    req = NA,
    tabId = NA,
    listeSeuil = NA,
    dataMod = NA
  )

  # Generate source via reactive expression
  mysource <- reactive({
    dbGetQuery(pool, "SELECT * from bilanmasse.v_export_r_scen_seuil")
  })

  # Observe the source, update reactive values accordingly
  observeEvent(mysource(), {

    # Lightly format data by arranging id
    # Not sure why disordered after sending UPDATE query in db    
    data <- mysource() %>% arrange(idscenar)
    data <- dbGetQuery(pool, "SELECT * from bilanmasse.v_export_r_scen_seuil")
    rvs$cdfilTmp <- paste(data$ordreseuil, data$nomfiliere, sep="-")
    data$cdfiliere <- rvs$cdfilTmp
    data <- data[c("idscenar", "nomscenar", "codeparam", "cdusage", "cdlithoprof", "cdfiliere", "valseuil")]
    rvs$data <- data
    rvs$dbdata <- data
    rvs$listeSeuil <- unique(rvs$data[,1])
    rvs$tabId <- dbGetQuery(pool, "SELECT * from bilanmasse.scenar_testr")

    updateSelectInput(session, "listScen", 
                      label = "Choix du scenario",
                      choices = isolate(rvs$listeSeuil)
                         )

  })

  rvs$dataSub <- reactive({ subset(rvs$data, rvs$data[,1] == input$listScen) })
  rvs$dataWide <- reactive({ dcast(rvs$dataSub(), idscenar+nomscenar+codeparam+cdusage+cdlithoprof~cdfiliere, value.var="valseuil") })
  rvs$dataWideTmp <- reactive({ rvs$dataWide() }) 

  ScenBase <- reactive({ subset(rvs$data, rvs$data[,1] == 2) })
  listeParam <- reactive({ unique(ScenBase()[,3]) })
  listeUsage <- reactive({ unique(ScenBase()[,4]) })
  listeLithoProf <- reactive({ unique(ScenBase()[,5]) })
  listeTraitement <- reactive({ unique(ScenBase()[,6]) })
  #

  # render the table
  output$tabScSeuil <- renderDataTable(
    rvs$dataWide(), rownames = FALSE, editable = TRUE, selection = 'none', filter= "top", options = list(
      columnDefs = list(list(className = 'dt-center', targets = "_all")))
  )

  proxy3 = dataTableProxy('tabScSeuil')

  observeEvent(input$tabScSeuil_cell_edit, {

    info = input$tabScSeuil_cell_edit

    i = info$row
    j = info$col = info$col + 1  # column index offset by 1
    v = as.numeric(info$value)


    rvs$dataWideTmp[i,j] <- v


    output$test <- renderPrint(rvs$dataWideTmp[i,j])

})

}

Все отлично работает, когда я хочу обновить новое значение в таблице: я получил эту ошибку:

Ошибка в [: объект типа 'closure' не может быть поднабором

Поэтому я попытался использовать SQL-запрос вместо подмножества:

  observeEvent(input$listScen, {
    val <- as.character(input$listScen)
    req <- paste0("SELECT * from bilanmasse.v_export_r_scen_seuil WHERE idscenar = ", val)
    observeEvent(input$listScen, { dataSub <- dbGetQuery(pool, req) })
    #cdfilTmp2 <- paste(dataSub[,6], dataSub[,7], sep="-")
    #dataSub[,9] <- cdfilTmp2
    #dataSub <- dataSub[c("idscenar", "nomscenar", "codeparam", "cdusage", "cdlithoprof", "V9", "valseuil")]
    #colnames(dataSub) <- c("idscenar", "nomscenar", "codeparam", "cdusage", "cdlithoprof", "cdfiliere", "valseuil")
    #dataWide <- dcast(dataSub, idscenar+nomscenar+codeparam+cdusage+cdlithoprof~cdfiliere, value.var="valseuil")
    #dataWideTmp <-dataWide
    output$test <- renderPrint(req)
  })

Но я получил странную ошибку, когда я печатал req, запрос в порядке:

[1] "SELECT * from bilanmasse.v_export_r_scen_seuil WHERE idscenar = 2"

Но в консоли R я получил ошибку:

Предупреждение в postgresqlQuickSQL (conn, Statement, ...): Не удалось создать execute: SELECT * from bilanmasse.v_export_r_scen_seuil WHERE idscenar =

Кто-нибудь знает решение, чтобы сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...