R 闪亮,未找到对象 'input'

R Shiny, Object 'input' not found

我收到错误:..stacktraceon..({ : object 'input' not found。如果 api key/url 的格式没有输入。我认为错误在第 25 行和第 27 行,其中输入 $api 键被切换,或者闪亮的应用程序没有开始的值。

这个应用程序的目标是获取用户输入的 api 键,并用 timevis 很好地显示它作为一个时间表。我尝试将 api 调用和数据清理放在服务器功能下方,但这不起作用。感谢您的帮助。

library(shiny)
library(httr)
library(jsonlite)
library(lubridate)
library(tools)
library(timevis)

# Define UI for application 
ui <- fluidPage(

    # Application title
    titlePanel("User Schedule"),
    # Input API INFo
    textInput(inputId = "apikey1", label = h3("API Key"), value = "enterkey"),
    textInput(inputId = "userkey1", label = h3("USER EMAIL"), value = "enteremail"),
    submitButton("Update View", icon("refresh")),
    hr(),
    timevisOutput("timeline"))

#Make API call and prepare Timeline information
options(stringsAsFactors = FALSE)

apikey2 <- input$apikey1

userkey2 <- input$userkey1

master_url <- sprintf("https://%s?api_key= %s",userkey2,apikey2)

my_url <- master_url

my_raw_result <- httr::GET(my_url)

my_raw_result

my_raw_result_text <- content(my_raw_result, "text")

my_raw_result_json <- fromJSON(my_raw_result_text, flatten = TRUE)

my_raw_result_df <- as.data.frame(my_raw_result_json)

dt <-  my_raw_result_df

dt[dt==""] <- NA # Replace all blank to NA
dt$start <- as.Date(as.character(dt$Schedule.item.date, 1,10)) # reformat the date field to my preferred format
dt$end <- NA
dt$content <- as.character(dt$schedule.item.type) # formate the content as text characters


# Define server logic required to draw time line
server <- function(input, output) {
    output$timeline <- renderTimevis({timevis(dt)})
}


# Run the application 
shinyApp(ui = ui, server = server)

正如@r2evans 所说,您创建 dt 的代码在 server 函数之外,因此它在全局环境中。那里不存在变量 input。因此,将 options(stringsAsFactors = FALSE)dt$content <- as.character(dt$schedule.item.type) 的代码放在 server 函数中。这将使您可以访问 input

这回答了您的问题,但您还有更多工作要做:

  • input 只能在活动上下文中访问,因此您将拥有 将您的初始化代码包装在 observe({}) 或类似的
  • 您需要防止 renderTimevis() 输入错误。类似于:
    output$timeline <- renderTimevis({
        req(input$apikey1, input$userkey1)
        if (is.data.frame(dt)) timevis(dt)
      })
  • 您可以考虑使用 placeholder= 而不是 value= textInputs 为您的用户提供初步指导。
  • 你需要 修改您的初始化代码以防止启动时出错 到缺失值。类似于:
observe({
    req(input$apikey1, input$userkey2)
    <... your initialisation code  ...>
  })

至少可以显示您的应用程序的 GUI。