R Shiny: Как использовать текстовый ввод пользовательского интерфейса из пользовательского интерфейса, в разделе сервера для поднабора фрейма данных? - PullRequest
0 голосов
/ 05 марта 2020

Я не видел, чтобы на эти вопросы четко отвечали в другом месте. Я хотел бы иметь поле «textInput», где пользователь вводит название страны «Аргентина». Исходя из этого ввода, в разделе кода сервера, я хотел бы подставить предварительно загруженный фрейм данных этим названием страны.

Может ли кто-нибудь помочь мне, как это можно сделать? Большое спасибо.

Ниже приведен код, использующий mtcars в качестве примера данных.

# Some Sample data to run app using mtcars
mtcars$Primary<- rownames(mtcars)
mtcars$Area <- "Argentina"
mtcars$Y2016<- mtcars$mpg
mtcars$Element <- "Gross Production Value (constant 2004-2006 million US$)"


# Defining UI ----
ui <- pageWithSidebar(

          # App title ----
          headerPanel("Subsector Selection Tool"),

          # Sidebar panel for inputs ----
          sidebarPanel(

            # Input: Country name
            textInput("country", "Please enter country name", "")#,

          ),

          # Main panel for displaying outputs ----
          mainPanel("")
)



# Use user input (country name) to subset desired dataframe. 
server <- function(input, output) {

#Trying to make user inputed country name into an object to be used in "reactive" code below, which in turn is be used to make dataset for graphing
country_interest <- reactive({
paste(input$country)
})


#Here I am trying to make the data analysis code run and create desired dataset for graphing, and 
subsetting for country selected by user
Value_c_e_PRIM_x  <- reactiveValue({

Value_c <- Value[which(Value$Area==country_interest),]

})

1 Ответ

1 голос
/ 05 марта 2020

Это минимальный пример приложения, которое делает то, что вы хотите:

library(shiny)
library(dplyr)

mtcars$country <- rep(c("Argentina", "Chile"), 16)

ui <- fluidPage(

  textInput("country", "Please enter country name", ""),
  tableOutput("table")

)

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

   data <- reactive(mtcars %>% filter(country == input$country))

   output$table <- renderTable({
   data()
   })
}
shinyApp(ui, server)

Однако обратите внимание на:

  • В вашем случае лучше поставить параметры фильтрации в selectInput(), так как там вы можете поместить значения, которые уже существуют в вашем фрейме данных.
  • Я считаю, что лучше всего поместить реактивные фреймы данных в функцию reactive (как в моем примере): внутри Вы вносите все необходимые изменения из входных данных, затем просто вызываете этот объект внутри функции рендеринга (обратите внимание на круглые скобки в конце, поскольку теперь это реактивный блестящий объект).
...