titles - recorrer una columna en r
Cómo hacer para bucle reactivo en servidor brillante en R? (1)
Como traté de retransmitir el comentario, mueva el for loop
fuera de la primera función renderPrint()
, de modo que h1-h5 esté disponible tanto para la output$a
como para la output$b
.
Desde su código, no hay ninguna razón por la cual el bucle deba restringirse solo a la output$a
ya que su parámetro m
se define afuera de todos modos:
library(shiny)
ui <- fluidPage(
mainPanel(fluidRow(textOutput("a")),
fluidRow(textOutput("b")))
)
server <- function(input, output) {
m <- reactive({1:5})
for (i in 1:length(m)){
assign(paste0("h",i), "u")
}
output$a <- renderPrint({
list(h1,h2)
})
output$b <- renderPrint({
list(h1,h2)
})
}
shinyApp(ui = ui, server = server)
Estoy usando assign
en for loop
para crear nuevas variables que quiero usar en más de una salida en ui brillante. Lo que sigue es un código de muestra:
library(shiny)
ui <- fluidPage(
mainPanel(fluidRow(textOutput("a")),
fluidRow(textOutput("b")))
)
server <- function(input, output) {
m <- reactive({1:5})
output$a <- renderPrint({
for (i in 1:length(m())){
assign(paste0("h",i), "u")
}
list(h1,h2)
})
output$b <- renderPrint({
list(h1,h2)
})
}
shinyApp(ui = ui, server = server)
Problema
Cada output
en el server
tiene su propio entorno. Por lo tanto, las variables h1
a h5
se crean dentro del output a
y, por lo tanto, no son accesibles para el output b
. Vea el resultado de la ejecución de la aplicación:
[[1]] [1] "u" [[2]] [1] "u"
[[1]] function (...) tags$h1(...) <environment: namespace:htmltools> [[2]] function (...) tags$h2(...) <environment: namespace:htmltools>
Idealmente, la segunda línea debería ser la misma que la primera línea. Si muevo el for loop
al server
, hay un problema de reactividad:
Error in .getReactiveEnvironment()$currentContext() :
Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
Pregunta
¿Cómo puedo hacer que el for loop
reactivo para que todas las salidas puedan acceder a ellos?
EDITAR
También intenté hacer las siguientes output
externas:
observe({for (i in 1:length(m())){
assign(paste0("om",i), "u")
}})
y
reactive({for (i in 1:length(m())){
assign(paste0("om",i), "u")
}})
Como h1
ya es una función brillante, cambié el nombre del objeto a "om". Pero el uso de cualquiera de los anteriores no ofrece buenos resultados:
output$a <- renderPrint({
list(length(m()), om1)
})
output$b <- renderPrint({
om1()
})
Error: object ''om1'' not found
Error: could not find function "om1"