Как получить доступ к значению из yaml в файле JS? - PullRequest
1 голос
/ 17 июня 2019

У меня блестящее приложение, которое использует пакет config, чтобы использовать различные конфигурации в зависимости от среды приложения (тестирование / QA / производственная среда).

Поскольку я также использую JS-файлдля приложения мне было интересно, возможно ли получить значения из файла config.yaml в файле JS?

Сейчас я жестко закодировал значения, которые мне понадобятся.

ВВ этом небольшом примере я хотел бы передать значение val в файле конфигурации в JavaScript, поэтому мне не нужно вручную изменять значение при развертывании в определенной среде.В файле app.R в части js я хочу получить доступ к config$val вместо жесткого кодирования значения, подобного var val = "abcdef";

config.yaml

default:
  val: 'default123'
qa:
  val: 'qa123'
prod:
  val: 'prod123'

app.R

sys <- Sys.info()
ifelse("Windows" %in% sys[1],
       {Sys.setenv(R_CONFIG_ACTIVE = "default")},
       {ip <- system("ip address | grep -A 1 'eth0'  | tail -2", intern = TRUE)
       ip <- gsub(pattern = "inet ", "", regmatches(ip, regexpr("inet [0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", ip)), fixed = T)
       ifelse(ip == "prodip",
              Sys.setenv(R_CONFIG_ACTIVE = "prod"),
              Sys.setenv(R_CONFIG_ACTIVE = "qasys"))
       })

js <- HTML('
$(document).on("shiny:connected", function (event) {
  // How can i acces values from the config file in here?
  //var val = config$val;  // I wanna do this line, rather than 
  var val = "abcdef";      // this line
  console.log(val);
})           
')

library(shiny)

ui <- fluidPage(
  tags$head(tags$script(js))
)

server <- function(input, output, session) {}

shinyApp(ui, server)

1 Ответ

1 голос
/ 18 июня 2019

Интересующий вопрос (+1). Вы можете прочитать данные в R и затем использовать Shiny.addCustomMessageHandler(...) для передачи данных из R в JavaScript.

На стороне сервера вы будете использовать:

  observeEvent(input$showAlert,{
    message = config$default$val
    session$sendCustomMessage("handler1", message)
  })                     

И в JavaScript:

Shiny.addCustomMessageHandler("handler1", showConfig );
function showConfig(message){
   alert(message);
}

Воспроизводимый пример:

library(yaml)
library(shiny)
config = read_yaml("config.yaml")

ui = shinyUI(
  bootstrapPage(
    tags$script('
                Shiny.addCustomMessageHandler("handler1", showConfig );
                function showConfig(message){
                  alert(message);
                }
    '),
    actionButton("showAlert", "show alert")
  )
)

server = shinyServer(function(input,output,session){
  observeEvent(input$showAlert,{
    message = config$default$val
    session$sendCustomMessage("handler1", message)
  })                     
})

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...