es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas con la reactividad en R: Has intentado hacer algo que solo se puede realizar desde dentro de un consumidor reactivo.

Estoy tratando de poner este código en Shiny con fechas dinámicas y selección de ticker, pero obtengo el siguiente error Operación no permitida sin un contexto reactivo activo. Has intentado hacer algo que solo se puede hacer desde dentro de un consumidor reactivo.

biblioteca(quantmod)
biblioteca(PerformanceAnalytics)
dt <- "2017-2-1"
aapl <- getSymbols.yahoo("AAPL", desde=dt, auto.assign = F)
aaplClose <- getSymbols.yahoo("AAPL", desde=dt, auto.assign = F)[,6]
aaplRets <- na.omit(dailyReturn(aaplClose, type="log"))

Aquí está mi implementación de shiny

biblioteca(shiny)
biblioteca(quantmod)
biblioteca(PerformanceAnalytics)

dt <- "2017-2-1"

ui <- fluidPage(
  dateInput("dt", "Seleccione una fecha:"),
  textInput("tkr", "Ingrese un símbolo de ticker:"),
  plotOutput("myplot")
)

server <- function(input, output, session) {
  aapl <- reactive ({
    getSymbols.yahoo(input$tkr, desde=input$dt, auto.assign = F)
    })
  aaplClose <- reactive ({
    getSymbols.yahoo(input$tkr, desde=input$dt, auto.assign = F)[,6]
  })
  aaplRets <- na.omit(dailyReturn(aaplClose(), type="log"))

  output$myplot <- renderPlot(
    { chartSeries(aapl())}
  ) 
}

shinyApp(ui, server)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el código no se está ejecutando dentro de un contexto reactivo. En Shiny, las expresiones reactivas se utilizan para crear contenido dinámico e interactivo. El error puede deberse a que no se ha creado correctamente una expresión reactiva o no se está utilizando una función dentro de una expresión reactiva.

    En el código proporcionado, la función aaplClose() no se utiliza dentro de una expresión reactiva, por lo que se produce un error. Para solucionar el problema, la función aaplClose() debe estar envuelta dentro de una expresión reactiva.

    Una posible solución es reemplazar la definición de aaplClose en la función del servidor con una expresión reactiva:

    aaplClose <- reactive({
        getSymbols.yahoo(input$tkr, from = input$dt, auto.assign = F)[, 6]
    })
    

    Luego, la función aaplClose() se puede llamar dentro de las expresiones aaplRets() y renderPlot():

    aaplRets <- reactive({
        na.omit(dailyReturn(aaplClose(), type = "log"))
    })
    
    output$myplot <- renderPlot({
        chartSeries(aaplClose())
    })
    

    El código final para la aplicación Shiny con fechas dinámicas y selección de ticker quedaría así:

    library(shiny)
    library(quantmod)
    library(PerformanceAnalytics)
    
    ui <- fluidPage(
        dateInput("dt", "Seleccione una fecha:"),
        textInput("tkr", "Ingrese un símbolo de ticker"),
        plotOutput("myplot")
    )
    
    server <- function(input, output, session) {
        aapl <- reactive({
            getSymbols.yahoo(input$tkr, from = input$dt, auto.assign = F)
        })
    
        aaplClose <- reactive({
            getSymbols.yahoo(input$tkr, from = input$dt, auto.assign = F)[, 6]
        })
    
        aaplRets <- reactive({
            na.omit(dailyReturn(aaplClose(), type = "log"))
        })
    
        output$myplot <- renderPlot({
            chartSeries(aaplClose())
        })
    }
    
    shinyApp(ui, server)
    

Comments are closed.