ste*_*ock 7 environment r scoping shiny
在http://shiny.rstudio.com/articles/scoping.html上,很好地解释了有光泽的范围规则.有3个环境或级别彼此嵌套:函数内,会话内和所有会话中可用的对象.使用< - 将更改您所在环境中的对象,<< - 将全局更改它,即对于所有会话.
如果我在会话中定义变量但想要在函数中更改它,该怎么办?
< - 只会在函数内更改它,因此其他函数无法读取,<< - 将为所有会话更改它.中间什么都没有?就像"只是一级"?
感谢Stephane的参考.如果在shinyServer()之前定义了一个对象,则使用<< - shinyServer()中的任何位置将更改应用程序的所有实例的值.如果对象在shinyServer()中定义,则<< - (函数内部或外部)将仅更改该应用实例的值.
我把一个带有计数器和实例ID的应用程序放在一起来测试它.运行应用程序的两个实例并在它们之间切换,增加计数显示<< - 的效果
ui.r
library(shiny)
shinyUI(pageWithSidebar(
headerPanel("Testing Environments"),
sidebarPanel(
actionButton("increment_counter", "Increase Count")
),
mainPanel(
tabsetPanel(
tabPanel("Print", verbatimTextOutput("text1"))
))
))
Run Code Online (Sandbox Code Playgroud)
server.r
instance_id<-1000
shinyServer(function(input, output, session) {
instance_id<<-instance_id+1
this_instance<-instance_id
counter<-0
edit_counter<-reactive({
if(input$increment_counter>counter){
counter<<-counter+1
}
list(counter=counter)
})
output$text1 <- renderPrint({
cat(paste("Session ID: ",Sys.getpid()," \n"))
cat(paste("Global Instance ID: ",instance_id," \n"))
cat(paste("This Instance ID: ",this_instance," \n"))
cat(paste("Button Value: ",input$increment_counter," \n"))
cat(paste("Counter Value: ",edit_counter()$counter," \n"))
})
}) # end server function
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4299 次 |
| 最近记录: |