Buenas, Estoy intentando que al ejectuar un boton en shiny me cargue de manera asincrona dos consultas. Una es a una consulta sql pesada (tarda 10 segundos) y la otra es una sql ligera (tarda 0 segundos). Intento que el resultado de la consulta ligera se muestre mientras se espera al resulatdo de la consulta pesada, pero no lo consigo. Estoy usando promises con future, en linux, pero no me funciona ? , ya que me muestra el ersultado del proceso pesado y el ligero solo cuando se ha ejecutado ya el pesado. Para simular las consultas, eh creado la funcion heavyFunction.... Aqui os pongo mi código. ¿Qué creeis que puede estar pasando? Lo curioso es que si os fijais en la consola, si que funciona bien. library(future) library(promises) plan(multiprocess) heavyFunction <- function(n){ Sys.sleep(n) print(n) } ui <- fluidPage( actionButton("go","Show the data"), textOutput("result0sec"), textOutput("result10sec") ) server <- function(input,output,session){ data0 <- eventReactive(input$go,{ heavyFunction(0) }) data10 <- eventReactive(input$go,{ future(heavyFunction(10)) }) output$result0sec <- renderText({ data <- data0() print(data) }) output$result10sec <- renderText({ data <- data10() data%...>%print() }) } shinyApp(ui,server) [[alternative HTML version deleted]]
En stack overflow veo esta possible explicación : - An eventReactive creates an object that *you* define like reactive does, but with out usual chain-reaction behavior you get from reactive. However it is lazily evaluated and cached like the other reactives. - An observeEvent can not create an object that you define (it creates something else). It is immediately evaluated and not cached. It is for causing side-effects. So if you need a data frame, or vector, or plot or something, but want to decouple from the usual reactive chain-reactions, use eventReactive. If you just want to cause an immediate side effect, observeEvent is your ticket Prueba a usar reactive en lugar de eventReactive y dentro de cada función reactive tomar una dependencia de input$go. El mié., 21 nov. 2018 8:48, Jesús Para Fernández < j.para.fernandez en hotmail.com> escribió:> Buenas, > > Estoy intentando que al ejectuar un boton en shiny me cargue de manera > asincrona dos consultas. Una es a una consulta sql pesada (tarda 10 > segundos) y la otra es una sql ligera (tarda 0 segundos). Intento que el > resultado de la consulta ligera se muestre mientras se espera al resulatdo > de la consulta pesada, pero no lo consigo. > > Estoy usando promises con future, en linux, pero no me funciona ? , ya > que me muestra el ersultado del proceso pesado y el ligero solo cuando se > ha ejecutado ya el pesado. > > Para simular las consultas, eh creado la funcion heavyFunction.... Aqui os > pongo mi código. ¿Qué creeis que puede estar pasando? Lo curioso es que si > os fijais en la consola, si que funciona bien. > > library(future) > library(promises) > plan(multiprocess) > > heavyFunction <- function(n){ > Sys.sleep(n) > print(n) > } > > > ui <- fluidPage( > actionButton("go","Show the data"), > textOutput("result0sec"), > textOutput("result10sec") > > ) > > server <- function(input,output,session){ > > > data0 <- eventReactive(input$go,{ > heavyFunction(0) > > > }) > > data10 <- eventReactive(input$go,{ > future(heavyFunction(10)) > > > }) > output$result0sec <- renderText({ > data <- data0() > print(data) > }) > > > output$result10sec <- renderText({ > data <- data10() > data%...>%print() > }) > > > > > } > shinyApp(ui,server) > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Buenas Lo pregunté tb en stackoverflow y lo que mandan hacer es mandar a future a un segundo plano, que es lo queno estaba haciendo. Os pego el enlace https://stackoverflow.com/questions/53407004/shiny-promises-future-is-not-working-on-eventreactive [https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon en 2.png?v=73d79a89bded]<https://stackoverflow.com/questions/53407004/shiny-promises-future-is-not-working-on-eventreactive> r - Shiny promises future is not working on eventReactive - Stack Overflow<https://stackoverflow.com/questions/53407004/shiny-promises-future-is-not-working-on-eventreactive> I have an inputButton than when you click it, 2 querys to mysql database are done. One is a heavy one (more than 10 secs) and the other is light (less than 0.01sec to get data). stackoverflow.com Gracias! Jesús ________________________________ De: Fernando Fernández <fernando.fernandez.gonzalez en gmail.com> Enviado: miércoles, 21 de noviembre de 2018 9:36 Para: Jesús Para Fernández Cc: R help CRAN Asunto: Re: [R-es] Promises Future en shiny no me funciona En stack overflow veo esta possible explicación : * An eventReactive creates an object that you define like reactive does, but with out usual chain-reaction behavior you get from reactive. However it is lazily evaluated and cached like the other reactives. * An observeEvent can not create an object that you define (it creates something else). It is immediately evaluated and not cached. It is for causing side-effects. So if you need a data frame, or vector, or plot or something, but want to decouple from the usual reactive chain-reactions, use eventReactive. If you just want to cause an immediate side effect, observeEvent is your ticket Prueba a usar reactive en lugar de eventReactive y dentro de cada función reactive tomar una dependencia de input$go. El mié., 21 nov. 2018 8:48, Jesús Para Fernández <j.para.fernandez en hotmail.com<mailto:j.para.fernandez en hotmail.com>> escribió: Buenas, Estoy intentando que al ejectuar un boton en shiny me cargue de manera asincrona dos consultas. Una es a una consulta sql pesada (tarda 10 segundos) y la otra es una sql ligera (tarda 0 segundos). Intento que el resultado de la consulta ligera se muestre mientras se espera al resulatdo de la consulta pesada, pero no lo consigo. Estoy usando promises con future, en linux, pero no me funciona ? , ya que me muestra el ersultado del proceso pesado y el ligero solo cuando se ha ejecutado ya el pesado. Para simular las consultas, eh creado la funcion heavyFunction.... Aqui os pongo mi código. ¿Qué creeis que puede estar pasando? Lo curioso es que si os fijais en la consola, si que funciona bien. library(future) library(promises) plan(multiprocess) heavyFunction <- function(n){ Sys.sleep(n) print(n) } ui <- fluidPage( actionButton("go","Show the data"), textOutput("result0sec"), textOutput("result10sec") ) server <- function(input,output,session){ data0 <- eventReactive(input$go,{ heavyFunction(0) }) data10 <- eventReactive(input$go,{ future(heavyFunction(10)) }) output$result0sec <- renderText({ data <- data0() print(data) }) output$result10sec <- renderText({ data <- data10() data%...>%print() }) } shinyApp(ui,server) [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org<mailto:R-help-es en r-project.org> https://stat.ethz.ch/mailman/listinfo/r-help-es [[alternative HTML version deleted]]