如何从JS文件中的yaml访问值?

时间:2019-06-17 15:37:57

标签: javascript r shiny yaml

我有一个闪亮的应用程序,它使用config软件包,根据应用程序环境(测试/质量检查/生产环境)使用不同的配置。

由于我还在为该应用程序使用JS文件,所以我想知道是否可以从JS文件中的config.yaml文件中获取值?

现在,我已经对所需的值进行了硬编码。

在这个小例子中,我想将配置文件中的val的值传递给JavaScript,因此在部署到特定环境时不必手动更改该值。 我想在js部分的 app.R 文件中访问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 个答案:

答案 0 :(得分:1)

有趣的问题(+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)