Блестящий, как обновить sh данных, загруженных до функции сервера - PullRequest
1 голос
/ 24 апреля 2020

Мне нужно разработать блестящий интерфейс с множеством загруженных CSV. Исходя из моего прошлого опыта с глянцевым, я предпочитаю импортировать эти данные перед работой сервера, таким образом я надеюсь, что каждый сеанс будет работать быстрее Приложение будет перезапускаться каждое утро, поэтому данные будут обновляться ежедневно. Проблема в том, что мне нужно рассмотреть дополнительное refre sh в течение дня, выполняемое вручную с помощью кнопки, которая вызывает скрипт внешнего обновления. Я не могу (но я надеюсь, что это возможно), обновить sh данные, загруженные в начале приложения. Ниже моего (фиктивного) кода:

сервер:

library(shinydashboard)
library(plotly)
library(data.table)
library(dplyr)


path1<-"C:/Users/.../DATA/"
path2<-"C:/Users/../DATA/csv/"

##load dataset at first start
table<-fread(file=paste0(path2,"main.csv"),data.table=FALSE))


shinyServer(function(input, output,session) {


    ##### refresh data with button####
    observeEvent(input$refresh_data,{
         source(paste0(path1,"any_script.r"),local = FALSE)
         table<<-fread(file=paste0(path2,"main.csv"))
    })

    #####...ui####
    table_r<-reactive({
    ##obs populate the input for choosing rows to be plotted
        obs<-rev(unique(table$anycolumn))
        curve_sint<-list(
            lotti=obs,
            data=obs
        )
    })


    output$obs_ui<-renderUI({
        selectInput("input_obs","Please choose the batch:",
                    choices =table()$obs ,multiple = T)
    })


    output$plot<-renderPlotly({
        table_r()$data%>%
            filter(anycolumn==input$input_obs)%>%
            plot_ly(
                x=~x,
                y=~y,
                color=~anycolumn,
                type="scatter"
            )
    })
})


пользовательский интерфейс:

library(shinydashboard)

ui <- dashboardPage(

  dashboardHeader(
    title = "shiny"                
  ),
  dashboardSidebar(
    width=250,
    sidebarMenu(
      menuItem(
        "plot data"
        tabName = "clhc",
        icon = NULL
      ),
      menuItem(
        "Update data",
        icon=icon("gear"),
        tabName="update_data"
      )
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(
        tabName = "clhc",
        fluidRow(
          column(width=3,
                 uiOutput("obs_ui")
          ),
        ),
        fluidRow(
          column(
            width=12,
            fluidRow(
              plotlyOutput("plot")
            )
          )
        )
      ),
      tabItem(
        tabName = "update_data",
        fluidRow(
          box(
            width=12,
            title="Sint HC",
            actionButton("refresh_sint_hc","Refresh", icon=icon("refresh"))
          )
        )
      )
    )
  )
)

Я уверен, что сценарий внутри followevent работает нормально, потому что если я поставить отпечаток (nrow (таблица)) после фреда, я вижу, что таблица обновлена ​​правильно. Я не могу понять, где хранятся новые данные, потому что из графика все еще доступны старые данные до обновления. Моя попытка совершенно неверна?

1 Ответ

1 голос
/ 24 апреля 2020

Использование <<- сделает table доступным глобально, и после завершения вашего блестящего приложения, но вам нужно, чтобы оно было reactive. Вот краткий пример использования reactiveVal (по умолчанию table1), который изменяется при выборе actionButton и чтении нового файла данных.

library(shiny)
library(data.table)

table1 <- fread(file = 'atest1.csv')

ui <- fluidPage(
  verbatimTextOutput("text"),
  actionButton("refresh", "Refresh")
)

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

  rv <- reactiveVal(table1)

  output$text <- renderText({
     names(rv())
  })

  observeEvent(input$refresh, {
    print("Refresh")
    table1 <<- fread(file = 'atest2.csv')
    rv(table1)
  })

}

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