我有一个闪亮的应用程序,它使用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)
答案 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)