R В Shiny, как использовать входное значение для вызова API? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующее рабочее приложение для вызова * stati c, однако я хотел бы иметь возможность использовать ввод пользователя для запроса отзывов mov ie:

# Load R packages
library(shiny)
library(shinythemes)
library(tidyverse)
library(jsonlite)
library(DT)

# Declarations
NYTIMES_KEY <- "I4Lwlq8HzbpqmtFb1IkhmO6y2xW650YL"

BASE_url <- paste0("https://api.nytimes.com/svc/movies/v2/reviews/search.json?query=godfather&api-key=", NYTIMES_KEY)


# Define UI
ui <- fluidPage(theme = shinytheme("cosmo"),
                navbarPage(
                    "Beta App",
                    tabPanel("Navbar 1",
                             sidebarPanel(
                                 tags$h3("Input:"),
                                 textInput("txt1", "Movie Name:", "")

                             ), # sidebarPanel
                             mainPanel(
                                 h1("Header 1"),

                                 h4("Output 1"),
                                 verbatimTextOutput("txtout"),
                                 dataTableOutput("tblOutput")

                             ) # mainPanel

                    )

                ) # navbarPage
) # fluidPage


# Define server function  
server <- function(input, output) {

    output$tblOutput <- renderDT(
        fromJSON(BASE_url, flatten = T) %>% data.frame() %>%
            select(results.display_title,results.link.url)
    )
} # server


# Create Shiny object
shinyApp(ui = ui, server = server)

1 Ответ

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

См. Ниже рабочий пример. Вот что я сделал:

  • Я добавил library(DT), так как исходный код не работал.
  • Я создал функцию get_movies, которая возвращает фильмы для данного query.
  • Я создал реактивное значение movies, которое содержит содержимое этой функции и переоценивается при нажатии кнопки. Мне нужно было добавить часть isolate(input$txt1), потому что в противном случае на каждый введенный символ отправляется запрос.
  • Я создал указанную кнопку search.
  • Поскольку movies теперь реактивный , нам нужно использовать его с movies().
# Load R packages
library(shiny)
library(shinythemes)
library(tidyverse)
library(jsonlite)
library(DT)

# Declarations
NYTIMES_KEY <- "I4Lwlq8HzbpqmtFb1IkhmO6y2xW650YL"


# Define UI
ui <- fluidPage(theme = shinytheme("cosmo"),
                navbarPage(
                  "Beta App",
                  tabPanel("Navbar 1",
                           sidebarPanel(
                             tags$h3("Input:"),
                             textInput("txt1", "Movie Name:", ""),
                             actionButton("search", "Search")

                           ), # sidebarPanel
                           mainPanel(
                             h1("Header 1"),

                             h4("Output 1"),
                             verbatimTextOutput("txtout"),
                             dataTableOutput("tblOutput")

                           ) # mainPanel

                  )

                ) # navbarPage
) # fluidPage


get_movies <- function(query) {
  url <- paste0("https://api.nytimes.com/svc/movies/v2/reviews/search.json?query=", query, "&api-key=", NYTIMES_KEY)

  fromJSON(url, flatten = T) %>% data.frame() %>%
    select(results.display_title,results.link.url)
}


# Define server function  
server <- function(input, output) {

  movies <- reactive({
    input$search

    query <- isolate(input$txt1)

    get_movies(query)
  })

  output$tblOutput <- renderDT(movies())


} # server


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