См. Ниже рабочий пример. Вот что я сделал:
- Я добавил
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)