Динамическая подстановка кадра данных на основе пользовательского ввода и представление полученной таблицы в качестве другого пользовательского ввода в приложении Shiny - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок в Shiny и пытаюсь сделать следующее - у меня есть CSV-файл с двумя столбцами - ID и имя. На стороне пользовательского интерфейса пользователь может ввести идентификатор (textInput). На стороне сервера я читаю в файле csv как фрейм данных и, основываясь на пользовательском textInput, я подмножество фрейма данных. Я хочу представить результирующий кадр данных (после поднабора) в качестве другого пользовательского ввода с флажком рядом с каждой строкой. Я не знаю с чего начать.

    ui <- fluidPage(
          useShinyjs(), #include shinyjs

           # Application title
           titlePanel(fluidRow(
             column(3, "  ADVANCE DATA RETRIEVAL",align="center"),
             column(2, offset = 0,img(height =90,width=250,src="logo.png",align="left"))

           )),


           sidebarLayout(sidebarPanel(width = 5,
                                      helpText("Please enter a station ID."),textInput("stationID", "IDs", value = ""),
                                      actionBttn("goButton","Go!",color = "default",style = "fill",size = "lg")), 
                                      mainPanel(width = 6,tableOutput("results"))))

    server <- function(input, output, session) {
    TS_metadata<-eventReactive(input$goButton,{
    PRECIP<-read.csv("Precip.csv", header = TRUE)
    Subset_Precip<-subset(PRECIP, PRECIP$ID==input$stationID)
    )}
}

PRECIP.csv выглядит так: строки, и я хочу, чтобы информационный кадр (с двумя строками) отображался как пользовательский ввод, где рядом с каждой строкой установлен флажок. Я представил здесь несколько строк кода, чтобы дать представление о том, что я пытаюсь сделать. Любая помощь очень ценится. Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2020

Вот краткая демонстрация, включающая флажки в формате DT. Это основано на решении , предоставленном в ответе github от yihui.

При таком подходе ваши подмножества данных будут храниться в reactiveVal для использования. Чекбоксы создаются динамически и используют введенный номер ID для входов чекбокса. Например, для выбранного ID 20546 будет установлен 20546_1 для первого флажка, 20546_2 для второго и т. Д. c. поэтому каждый из них уникален при изменении файлов данных (просто для демонстрации).

В другом выводе показано, как можно получить результаты флажка (ИСТИНА / ЛОЖЬ).

library(shiny)
library(DT)
library(shinyjs)
library(shinyWidgets)


ui <- fluidPage(
    useShinyjs(), #include shinyjs
    # Application title
    titlePanel(
      fluidRow(
        column(3, "  ADVANCE DATA RETRIEVAL",align="center"),
        column(2, offset = 0,img(height =90,width=250,src="logo.png",align="left"))
    )),
    sidebarLayout(
      sidebarPanel(
        width = 5,
        helpText("Please enter a station ID."),textInput("stationID", "IDs", value = ""),
        actionBttn("goButton","Go!",color = "default",style = "fill",size = "lg")), 
      mainPanel(
        width = 6,
        DT::dataTableOutput("results"),
        verbatimTextOutput('cbinfo')
      )
    )
  )

server = function(input, output, session) {

  Subset_Precip <- reactiveVal(NULL)

  TS_metadata <- observeEvent(input$goButton,{
    PRECIP<-read.csv("Precip.csv", header = TRUE)
    Subset_Precip(subset(PRECIP, PRECIP$ID==input$stationID))
  })

  # create a character vector of shiny inputs
  shinyInput = function(FUN, len, id, ...) {
    inputs = character(len)
    for (i in seq_len(len)) {
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, width = 1, ...))
    }
    inputs
  }

  # obtain the values of inputs
  shinyValue = function(id, len) {
    unlist(lapply(seq_len(len), function(i) {
      value = input[[paste0(id, i)]]
      if (is.null(value)) NA else value
    }))
  }

  dataCB <- reactive({
    if (is.null(Subset_Precip())) return(data.frame(NULL))
    data.frame(
      v1 = shinyInput(checkboxInput, nrow(Subset_Precip()), paste0(input$goButton, '_'), value = TRUE),
      v2 = Subset_Precip()$ID,
      v3 = Subset_Precip()$Name,
      stringsAsFactors = FALSE
    )
  })

  # render the table containing shiny inputs
  output$results = DT::renderDataTable(
    dataCB(), server = FALSE, escape = FALSE, selection = 'none', options = list(
      preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
    )
  )

  # print the values of inputs
  output$cbinfo = renderPrint({
    if (is.null(Subset_Precip())) return (NULL)
    data.frame(v1 = shinyValue(paste0(input$goButton, '_'), nrow(Subset_Precip())))
  })
}

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