r语言 - 具有仅用于 Shiny 会话的 "global" 变量



我有多个具有多个会话的 Shiny 应用程序,我希望有一个全局变量,但仅限于每个会话,而不是覆盖不同会话之间的值。由于该要求,我无法使用<<-赋值运算符。

我需要它的原因是我有几个变量被许多源函数使用,我不想将它们作为参数发送到所有函数。

关于如何做到这一点的任何想法?

编辑

创建了一个简单的例子来更好地解释我的问题。假设这是我server.R文件:

shinyServer(function(input, output, session) {
  source('shinyCommons.R')
  reportId <<- generateReportID()
  createLogFile()
})

这是包含非反应函数的shinyCommons.R函数文件:

createLogFile <- function()
{
  system(paste(touch,reportId,".log",sep=""))
}

现在的问题是,如果我使用 <<- 运算符,并且不同的会话同时处于活动状态,它们会覆盖彼此的reportID值。但是如果我把它放在一个reactive的上下文中,那么非反应函数就无法到达它。

有人可以帮助我了解我应该如何设计它吗?顺便说一句 - 我知道我可以将其作为参数发送到函数,但这只是一个小例子,我有很多变量和很多使用它们的函数

显然,我赢了赌注:您错误地使用了<<-运算符。这是一个工作示例。

ui.R

barraLaterale<-sidebarPanel(
    fluidRow(column(numericInput("numObs",label="Num Obs.",value=10000,min=100,step=1),width=6),column(helpText("Something"),actionButton("Bottone",label="Go!"),width=6)),
    sliderInput("media",label="Pick gaussian mean",min=-50,max=50,value=0),
    sliderInput("varianza",label="Pick gaussian standard deviation",min=0,max=10,value=5)
)
principale<-mainPanel(plotOutput("plotRisultato"),plotOutput("plotEsatto"))
shinyUI(fluidPage(
    titlePanel("Applicazione Prova"),
    sidebarLayout(barraLaterale,principale)
))

server.R

shinyServer(function(input, output) {
    #HERE WE DEFINE COMMON OBJECTS
    object<-0
    calcolaIstogramma<-reactive({
        rnorm(input$numObs,input$media,input$varianza)  
    })
    output$plotRisultato<-renderPlot({
        a<-input$Bottone
        variabile<-isolate(calcolaIstogramma())
        hist(variabile,breaks=50,col="blue")
    })
    output$plotEsatto<-renderPlot({
        a<-input$Bottone
        variabile<-isolate(calcolaIstogramma())
        #HERE WE ARE UPDATING THE VALUES
        object<<-object+1
        cat(object,"n")
        plot(variabile,xlab="Variable trace",ylab="",ty="l")
    })
})

在运行应用时打开几个会话。每次按下按钮时,您都应该在外壳上看到计数器。您可以看到计数器未共享。公共对象在函数参数的作用域中定义 shinyServer 。然后,在其他函数/反应式上下文中,您可以使用<<-来更新/覆盖值。

您在采购时是否尝试使用local选项?

这应该有效:

shinyServer(function(input, output, session) {
    source('shinyCommons.R', local=TRUE)
    reportId <- generateReportID()
    createLogFile()
})

请注意,您应该使用 <- 而不是 <<- 将变量保留在本地环境中(因此跨会话独立)。

相关内容

  • 没有找到相关文章

最新更新