简体   繁体   中英

R ShinyDashboard. Retriving data via API into a data frame after ActionButton. Function error

I am trying to create a simple app to get basic info for a firm based on its CVR (identification number). For example, by inputting LEGO's CVR number (54562519) and pressing the button "Search", API would look for it and generate a table. Here is my sample code:

Use '54562519' cvr input to test it. The API code works outside the shiny app.

library(shiny)
library(shinydashboard)
library(httr)
library(jsonlite)
library(dplyr)


header <-  dashboardHeader()
sidebar <- dashboardSidebar(sidebarMenu(
  menuItem("New Entry",tabName = "new_entry_tab", icon = icon("stats-bars", lib = 'glyphicon'))))
body <-  dashboardBody(
  tabItems(
    tabItem(tabName = "new_entry_tab",
            fluidPage(
              fluidRow(numericInput(inputId = "cvr", "Enter CVR number:",
                                                value = "cvr",
                                                min = 1000000,
                                                max = 9999999,
                                                step = NA,
                                                width = NULL)), 
              fluidRow(actionButton("button_cvr", "Search")),
              fluidRow(box(tableOutput("firm_info")))
            ))))

ui <- dashboardPage(header, sidebar, body)

# Server ----
server <- function(input, output) {
  
  
  api_firm_call <- observeEvent(input$button_cvr, {
    cvr <- input$cvr
    firm_data <- GET(paste0("https://cvrapi.dk/api?search=",cvr,"&country=dk"))
    firm <-fromJSON(rawToChar(firm_data$content))
    firm_matrix <- matrix(ncol = 1, nrow = 5)
    rownames(firm_matrix) <- c("Name", "Address", "City", "Industry", "Industry Name")
    colnames(firm_matrix) <- " "
    firm_matrix[1:5, 1] <- c(firm$name, firm$address, paste(firm$zipcode, firm$city),firm$industrycode, firm$industrydesc)
    firm_table <- tibble(firm_matrix) 
  })

  output$firm_info <- renderTable({api_firm_call()})
  
}
shinyApp(ui, server)

I receive a Warning: Error in api_firm_call: could not find function "api_firm_call", but I am don't know how to handle it.

Instead of using observeEvent switch to eventReactive to fix your issue as it allows to return your firm_table . Additionally I moved your code for the API search in a separate function. Doing so makes your code easier to debug, ie you can test the function outside of shiny, and makes your code cleaner.

Note: To make the reprex more minimal I dropped the numericInput and hard-coded the cvr example value:

library(shiny)
library(shinydashboard)
library(httr)
library(jsonlite)
library(dplyr)

fct_api_firm_call <- function(cvr) {
  firm_data <- GET(paste0("https://cvrapi.dk/api?search=",cvr,"&country=dk"))
  firm <-fromJSON(rawToChar(firm_data$content))
  firm_matrix <- matrix(ncol = 1, nrow = 5)
  rownames(firm_matrix) <- c("Name", "Address", "City", "Industry", "Industry Name")
  colnames(firm_matrix) <- " "
  firm_matrix[1:5, 1] <- c(firm$name, firm$address, paste(firm$zipcode, firm$city),firm$industrycode, firm$industrydesc)
  tibble(firm_matrix) 
}

cvr <- "54562519"

header <-  dashboardHeader()
sidebar <- dashboardSidebar(sidebarMenu(
  menuItem("New Entry",tabName = "new_entry_tab", icon = icon("stats-bars", lib = 'glyphicon'))))
body <-  dashboardBody(
  tabItems(
    tabItem(tabName = "new_entry_tab",
            fluidPage(
              fluidRow(actionButton("button_cvr", "Search")),
              fluidRow(box(tableOutput("firm_info")))
            ))))

ui <- dashboardPage(header, sidebar, body)

# Server ----
server <- function(input, output) {
  
  api_firm_call <- eventReactive(input$button_cvr, {
    fct_api_firm_call(cvr)
  })
  
  output$firm_info <- renderTable({
    api_firm_call()
  })
}
shinyApp(ui, server)

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM