Как исправить ошибку "` data` должен быть фреймом данных или другим объектом, который можно принудительно вызвать с помощью `fortify ()`, а не числовым вектором "в приложении R Shiny? - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в Shiny и пытаюсь написать приложение, которое будет создавать ggplot индексированных цен акций одной или нескольких компаний на одном графике. У меня есть R-скрипт, который делает именно это, но когда я попытался реализовать его как приложение Shiny, я обнаружил следующую ошибку: «Проанализировано более одного выражения». текущая ошибка, которую я получаю, это:

data должен быть фреймом данных или другим объектом, который можно задать с помощью fortify(), а не числовым вектором

Не могли бы вы помочь мне понять, что происходит и что мне нужно сделать, чтобы это исправить?

Я столкнулся с этой ошибкой после исправления предыдущей ошибки, в которой говорилось, что мои «данные» не были фреймом данных. Я нашел в stackoverflow, что я должен был вставить aes_string() вместо aes() при создании выходного графика.

Я также пытался поместить свое выражение в renderPlot() в eval(), но это не решило проблему.

Кроме того, когда я добавляю только один тикер, я получаю следующую ошибку:

"аргументы подразумевают различное количество строк: 1, 0"

Вот мой код:

library(shiny)
library(tidyquant)
library(ggplot2)
library(dplyr)

#ui logic
ui <- fluidPage(
  #App title
  titlePanel("Indexed Stock Price Chart"),

  #Sidebar Layout w/ input & output definitions
  sidebarPanel(
    #Input: Enter Ticker Names
    helpText("Enter tickers separated by a comma as shown in this example: AMZN,GOOG,MSFT"),
    textInput("ticker", label = h3("Ticker(s)"), value = "Enter tickers...."),
    #Input: Date Range
    dateRangeInput("dates", label = "Date Range", start = Sys.Date()-360, end = Sys.Date()),
    #Input: Select Date Breaks
    selectInput("dateBr", label = "Choose a date break for x-axis", choices = c("1 month", "3 months", "4 months",
                                                                                "6 months", "1 year", "2 years", "3 years",
                                                                                "4 years", "5 years", "10 years"), selected = "6 months"),
    #Input: actionButton()
    actionButton("update", "Create Plot")
  ),

  mainPanel(
    plotOutput("plot1")
  )
)

#server logic
server <- function(input,output) {
  selectedData<- eventReactive(input$update,{
    start_date <- input$dates[1]
    end_date <- input$dates[2]
    dateBrInput <- input$dateBr
    symbol <- unlist(strsplit(input$ticker, ","))
    d1 <- tq_get(symbol,get = "stock.prices", from = start_date, to = end_date)
    S_index <- numeric(0)
    for (i in 1:length(symbol)){
      S_index <- c(S_index, d1$adjusted[which(d1$symbol == symbol[i] & d1$date == min(d1$date))])
    }
    index_df <- data.frame(symbol, S_index)
    new_df <- full_join(d1, index_df, by = "symbol")
    new_df$indexed_adj <- new_df$adjusted/new_df$S_index
  })

  output$plot1 <- renderPlot({
    ggplot(selectedData(),aes(x=date, y=indexed_adj,colour= symbol)) +
      geom_line() +
      xlab("Date") + ylab("Indexed SP") + 
      theme(plot.title = element_text(hjust = 0.5)) +
      scale_x_date(date_labels = "%b %y", date_breaks = dateBrInput) + 
      theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
            panel.background = element_blank(), axis.line = element_line(colour = "black"))+
      labs(color = "Company") + theme(legend.title = element_blank())
  })
}


shinyApp (ui = ui, server = server)

Я хочу создать приложение Shiny, которое позволит пользователям вводить имена тикеров, даты начала и окончания, а также выбирать разрывы дат для оси X, чтобы создать график временного ряда с количеством акций X компаний. Тем не менее, в настоящее время мой код выдает сообщение об ошибке «данные должны быть фреймом данных или другим объектом, который может быть обработан с помощью fortify(), а не числовым вектором», и не генерирует график, который я хочу построить.

...