GOOGLE ADS

Samstag, 16. April 2022

Glänzendes Objekt nicht gefunden

Shiny getsymbols funktioniert, aber kein Spaltenname mit "close"

Der obige Link ist eine Frage, die ich vor zwei Tagen gestellt habe und die gelöst ist. Wenn ich versuche, an meinem Projekt weiterzuarbeiten, stoße ich auf ein neues Problem.

Ich versuche, das Zusammenfassungsdiagramm zu zeichnen, aber es tritt ein Fehler auf. (Objekt 'ret1' nicht gefunden)

ui.R

library(shiny)
library(quantmod)
library(PerformanceAnalytics)
ui <- fluidPage(
textInput("symb", "Stock Name", "AAPL"),

dateRangeInput("dates",
"Date range",
start = "2020-01-01",
end = as.character(Sys.Date())),
actionButton("GO","GO"),
(plotOutput("perfsPlot"))
)

Server.R

server <- function(input, output, session) {
data <- eventReactive(input$GO,{
getSymbols(input$symb, src = "yahoo",
from = input$dates[1],
to = input$dates[2],
auto.assign = FALSE)

price <<- Cl(get(input$symb))
r <<- price/Lag(price) - 1
delta <<-0.005
signal <<-c(NA) # first signal is NA


for (i in 2: length(price)){
if (r[i] > delta){
signal[i]<- 1
} else if (r[i]< -delta){
signal[i]<- -1
} else
signal[i]<- 0
}

signal<<-reclass(signal,price)


trade1 <<- Lag(signal)
ret1<<-dailyReturn(input$symb)*trade1 # I tried to replace this code by assign(x = "ret1", value = dailyReturn(input$symb)*trade1, envir =.GlobalEnv)
})


output$perfsPlot <- renderPlot({
charts.PerformanceSummary(ret1) #object 'ret1' not found, I tried to replace this code by data()
})
)

Ich habe einige Nachforschungen angestellt und festgestellt, dass dies möglicherweise damit zusammenhängt, dass "wenn ein reaktiver Block ausgeführt wird, alle darin enthaltenen Elemente verschwinden". Folglich wird ret1 nicht gespeichert. Ich habe versucht, jedes Objekt zuzuweisen, wie Preis, r, Delta... aber es funktioniert immer noch nicht. Wie kann ich alle Objekte unter eventReactive speichern?

Hier ist der Code, der in R ausgeführt werden kann

price <- Cl(MSFT)
r <- price/Lag(price) - 1
delta<-0.005
signal <-c(NA) # first signal is NA
for (i in 2: length(Cl(MSFT))){
if (r[i] > delta){
signal[i]<- 1
} else if (r[i]< -delta){
signal[i]<- -1
} else
signal[i]<- 0
}
signal<-reclass(signal,Cl(MSFT))
trade1 <- Lag(signal)
ret1<-dailyReturn(MSFT)*trade1
names(ret1) <- 'Naive'
charts.PerformanceSummary(ret1)

Nachdem ich diese Datei in R ausgeführt habe, alle Objekte, die in meiner lokalen Umgebung gespeichert sind, kann die Shiny-App die Grafik erfolgreich anzeigen.


Lösung des Problems

Ich denke, das Hauptproblem war, dass Sie versucht haben, reaktive Elemente mit in die Umgebung des Servers zu speichern <<-. Stattdessen würde ich vorschlagen, ein reaktives Datenobjekt zu erstellen und dann die reaktiven Daten zum Erstellen der Diagramme zu verwenden. Hier ist ein Beispiel dafür, wie es funktionieren würde. Beachten Sie, dass Sie in der Benutzeroberfläche die Aktionsschaltfläche nicht benötigen, die Daten werden jedes Mal neu gezeichnet, wenn Sie die Eingaben ändern (mehr dazu weiter unten).

library(shiny)
library(quantmod)
library(PerformanceAnalytics)
ui <- fluidPage(


textInput("symb", "Stock Name", "AAPL"),

dateRangeInput("dates",
"Date range",
start = "2020-01-01",
end = as.character(Sys.Date())),

# actionButton("GO","GO"),

plotOutput("perfsPlot")
)

Auf dem Server haben sich die Dinge am meisten geändert:

server <- function(input, output, session) {
symb <- reactive(input$symb)
symb_d <- symb %>% debounce(1000)
dts <- reactive(input$dates)
dts_d <- dts %>% debounce(1000)

data <- reactive({
d1 <- getSymbols(symb_d(), src = "yahoo",
from = dts_d()[1],
to = dts_d()[2],
auto.assign = FALSE)

price <- Cl(d1)
r <- price[,1]/Lag(price[,1]) - 1
delta <-0.005
signal <-c(NA) # first signal is NA


for (i in 2: nrow(price)){
if (r[i] > delta){
signal[i]<- 1
} else if (r[i]< -delta){
signal[i]<- -1
} else
signal[i]<- 0
}

signal<-reclass(signal,price)


trade1 <- Lag(signal)
ret1 <- dailyReturn(d1)*trade1 # I tried to replace this code by assign(x = "ret1", value = dailyReturn(input$symb)*trade1, envir =.GlobalEnv)
d1$price <- unname(price[,1])
d1$signal <- signal
d1$trade1 <- trade1
d1$ret1 <- ret1
d1
})


output$perfsPlot <- renderPlot({
charts.PerformanceSummary(data()$ret1,
main = paste0(input$symb, " Performance"))
})
}

Beachten Sie zunächst, dass ich die Eingaben in einen reaktiven Kontext gestellt und sie dann "entprellt" habe, damit sie nicht versuchen, sich zu aktualisieren, während Sie noch tippen. Hier ist ein Beitrag, der das Entprellen und Drosseln erklärt. Als Nächstes habe ich die Daten zu einem reaktiven Objekt gemacht, das einen Datenrahmen zurückgibt, der die ursprüngliche Ausgabe von zusammen getSymbol()mit den abgeleiteten Größen price, signalund enthält. All dies wird in einem einzigen reaktiven Objekt zurückgegeben, auf das Sie mit zugreifen können. In Ihrem Code gab es mehrere Stellen, an denen der Code einfach nicht funktionierte. Ein Beispiel war:trade1ret1data()

price <<- Cl(get(input$symb))

was fehlgeschlagen ist, weil get()es nicht wusste, wie man mit einer Zeichenkette arbeitet, wie "AAPL". Als das nicht funktionierte, schlugen auch alle nachfolgenden Berechnungen fehl. Sie können im Plot sehen, dass ich das data()Objekt und dann das Symbol in der Hauptplotbezeichnung verwendet habe:

charts.PerformanceSummary(data()$ret1, 
main = paste0(input$symb, " Performance"))

Insgesamt ergab dies eine Ausgabe, die wie folgt aussah:

Geben Sie hier die Bildbeschreibung ein

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...