簡體   English   中英

只有Shiny會話的“全局”變量

[英]Having a “global” variable only for session in Shiny

我有多個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的function參數范圍內定義。 然后,在其他函數/反應上下文中,您可以使用<<-來更新/覆蓋值。

您是否嘗試在采購時使用local選項?

這應該工作:

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

請注意,您應該使用< - 而不是<< - 來保持變量在本地環境中(因此在會話中保持獨立)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM