Я новичок в 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()
, а не числовым вектором», и не генерирует график, который я хочу построить.