Хранение реактивного вывода в векторе - Shiny R - PullRequest
1 голос
/ 16 октября 2019

Я работаю над созданием блестящего приложения. Я использовал несколько фильтров и визуализировал фрейм данных, и фрейм данных динамически меняется в соответствии с пользовательским вводом. Но я не могу сохранить конкретное значение столбца из фрейма данных в вектор. Мне нужно каждый раз сохранять реактивный вывод в векторе, чтобы я мог использовать значения позже. Здесь значения хранятся в text_vec, и мне нужно передать это в API, но я не могу получить доступ к значениям из text_vec, и мне приходится каждый раз передавать обновленные значения в API

library(dplyr)
library(shiny)

shinyApp(ui = fluidPage(

  sidebarLayout(

    sidebarPanel(
      selectInput(inputId = "cyl",
                  label = "Number cylinders:",
                  choices = c("all",sort(unique(mtcars$cyl))),
                  selected = "all"),
      actionButton("capture",
                   "capture value")

    ), # closes sidebarPanel


    mainPanel(

      tableOutput("text"),
      tableOutput("text2"),
      tableOutput("text3"),
      tableOutput("table")

    ) # closes mainPanel
  ) # closes sidebarLayout    

), # closes fluidPage

server = function(input, output) {

  # some example reactive data    
  cars_react <- reactive({

    mtcars %>% 
      filter(cyl == input$cyl | input$cyl == "all")

  })

  # simply global assignment of a reactive vector
  observeEvent(cars_react(), {

    # here is a globally assigned vector taken from the reactive data
    # reused in a render statement it will not react to change, since it is not reactive 

    test_vec3 <<- unique(cars_react()$hp)

  })



  # here a file is written to the working directory of your shiny app
  # everytime cars_react() changes write (and overwrite) vector to a file 
  observeEvent(cars_react(), {

    test_vec = unique(cars_react()$hp)

    saveRDS(test_vec, file = "test_vec.Rdata")

  })

  # same as above but the file is gradually growing and not overwritten
  # everytime cars_react() changes add vector to a (over several sessions growing) list
  observeEvent(cars_react(), {

    test_vec2 = unique(cars_react()$hp)

    if (file.exists("test_list.Rdata")) {

      temp = readRDS("test_list.Rdata")

      test_list = c(temp, list(test_vec2))

    } else {

      test_list = list(test_vec2)

    }

    saveRDS(test_list, file = "test_list.Rdata")


  })

  # here we access the reactive data with isolate and make it non-reactive, but can update the values through a button click
  text_vec <<- eventReactive(input$capture, {

    isolate(unique(cars_react()$hp))

  })



  # output of our reactive data as table
  output$table <- renderTable({

    cars_react()

  })   

  # text output of globally assigned non-reactive vector test_vec3 (not changing!)
  output$text <- renderText({

    test_vec3

  })   

  # you can capture values of reactives with isolate, but then, they don't change anymore 
  # text output of isolated formely reactive vector unique(cars_react()$hp (not changing!)
  output$text2 <- renderText({

    isolate(unique(cars_react()$hp))

  })   

  # text output of new reactive vector (changes when input$capture button is clicked)
  output$text3 <- renderText({
    text_vec()

  })  

  for (i in text_vec)
  {
    url = "https://oscar.com/prweb/PRRestService/"
    parameters<-'{
    {
    "Reference":"Account"
    ,"ReferenceValue":""
    }'
      b<-fromJSON(parameters)
      b["ReferenceValue"]=i
      r <- POST(url, body = parameters,encode = "json")
      r_c<-toJSON(content(r))
      print(r_c)
    }


  }


)

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

** Обновленный ответ **

Исходя из вашего обновленного ответа, я бы обернул ваш вызов API в observeEvent, который запускается при нажатии кнопки действия. Поскольку вы не предоставляете рабочий пример с каким-то реальным кодом, я не уверен, поможет ли приведенный ниже пример. Я также предполагаю, что ваш for loop правильный и работает (с моей стороны, я не могу знать без реального API и некоторых реальных значений).

library(dplyr)
library(shiny)
library(httr)
library(jsonlite)

shinyApp(ui = fluidPage(


      selectInput(inputId = "cyl",
                  label = "Number cylinders:",
                  choices = c("all",sort(unique(mtcars$cyl))),
                  selected = "all"),
      actionButton("capture",
                   "capture value")


), # closes fluidPage

server = function(input, output) {

  # some example reactive data    
  cars_react <- reactive({

    mtcars %>% 
      filter(cyl == input$cyl | input$cyl == "all")

  })



  # here we access the reactive data with isolate and make it non-reactive, but can update the values through a button click
  observeEvent(input$capture, {

    for (i in unique(cars_react()$hp))
    {
      url = "https://oscar.com/prweb/PRRestService/"
      parameters<-'{
      "Reference":"Account"
      ,"ReferenceValue":""
      }'
      b<-fromJSON(parameters)
      b["ReferenceValue"]=i
      r <- POST(url, body = parameters,encode = "json")
      r_c<-toJSON(content(r))
      print(r_c)
    }

  })

}

)

Старый ответ

Из вашего вопроса не ясно, как, где и как часто вы хотите использовать вектор вашего реактивного фрейма данных. Но это важный вопрос, поскольку очень трудно понять концепцию реактивности и способы ее доступа, когда вы работаете в чистой нереактивной среде R.

Ниже приведен простой пример приложения, в котором показано, как получить доступ. векторы в реактивных фреймах данных и как их можно использовать.

Надеюсь, это поможет лучше понять реактивность в блестящем.

library(dplyr)
library(shiny)

shinyApp(ui = fluidPage(

  sidebarLayout(

    sidebarPanel(
    selectInput(inputId = "cyl",
                label = "Number cylinders:",
                choices = c("all",sort(unique(mtcars$cyl))),
                selected = "all"),
    actionButton("capture",
                 "capture value")

  ), # closes sidebarPanel


    mainPanel(

      tableOutput("text"),
      tableOutput("text2"),
      tableOutput("text3"),
      tableOutput("table")

  ) # closes mainPanel
  ) # closes sidebarLayout    

), # closes fluidPage

  server = function(input, output) {

# some example reactive data    
cars_react <- reactive({

  mtcars %>% 
    filter(cyl == input$cyl | input$cyl == "all")

  })

# simply global assignment of a reactive vector
observeEvent(cars_react(), {

    # here is a globally assigned vector taken from the reactive data
    # reused in a render statement it will not react to change, since it is not reactive 

    test_vec3 <<- unique(cars_react()$hp)

    })

  # here a file is written to the working directory of your shiny app
  # everytime cars_react() changes write (and overwrite) vector to a file 
  observeEvent(cars_react(), {

    test_vec = unique(cars_react()$hp)

    saveRDS(test_vec, file = "test_vec.Rdata")

    })

  # same as above but the file is gradually growing and not overwritten
  # everytime cars_react() changes add vector to a (over several sessions growing) list
  observeEvent(cars_react(), {

    test_vec2 = unique(cars_react()$hp)

    if (file.exists("test_list.Rdata")) {

      temp = readRDS("test_list.Rdata")

      test_list = c(temp, list(test_vec2))

    } else {

    test_list = list(test_vec2)

    }

    saveRDS(test_list, file = "test_list.Rdata")


  })

  # here we access the reactive data with isolate and make it non-reactive, but can update the values through a button click
  text_vec <- eventReactive(input$capture, {

    isolate(unique(cars_react()$hp))

  })

  # output of our reactive data as table
  output$table <- renderTable({

    cars_react()

    })   

  # text output of globally assigned non-reactive vector test_vec3 (not changing!)
  output$text <- renderText({

    test_vec3

  })   

  # you can capture values of reactives with isolate, but then, they don't change anymore 
  # text output of isolated formely reactive vector unique(cars_react()$hp (not changing!)
  output$text2 <- renderText({

    isolate(unique(cars_react()$hp))

  })   

  # text output of new reactive vector (changes when input$capture button is clicked)
  output$text3 <- renderText({

    text_vec()

  })  

  }

)
0 голосов
/ 16 октября 2019

Простой способ сохранить фрейм данных во всех средах, используемых в приложении Shiny, - это использовать назначение «<< -» вместо «<-». Это не очень хороший метод программирования, ноэто может быть то, что вы надеетесь найти. </p>

# To get a data frame to persist, use
a <<- b

# instead of
a <- b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...