我有多个具有多个会话的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
上下文中,那么非反应函数就无法达到它。
有人可以帮助我理解我应该如何设计它? 顺便说一句 - 我知道我可以将它作为参数发送给函数,但这只是一个小例子,我有很多变量和很多使用它们的函数
答案 0 :(得分:2)
显然,我赢了赌注:你错误地使用了<<-
运营商。这是一个有效的例子。
在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
的函数参数的范围内定义。然后,在其他函数/反应上下文中,您可以使用<<-
来更新/覆盖值。
答案 1 :(得分:0)
您在采购时是否尝试使用local
选项?
这应该有效:
shinyServer(function(input, output, session) {
source('shinyCommons.R', local=TRUE)
reportId <- generateReportID()
createLogFile()
})
请注意,您应该使用&lt; - 而不是&lt;&lt; - 来保持变量在本地环境中(因此在会话中保持独立)。