R 当用户已经在使用闪亮的应用程序时,如何阻止或限制访问

R 当用户已经在使用闪亮的应用程序时,如何阻止或限制访问,r,shiny,privileges,ace-editor,R,Shiny,Privileges,Ace Editor,我有一个使用Ace编辑器的闪亮应用程序。现在,我想让它在第一个用户使用此编辑器时,其他用户无法编辑文档,而只能查看文档 如何实现这一点 代码是: library(shiny) library(shinyAce) library(stringi) ui <- fluidPage( br(), uiOutput("aceEditor1"), downloadButton('save1', 'Save editor content') ) server <- functio

我有一个使用Ace编辑器的闪亮应用程序。现在,我想让它在第一个用户使用此编辑器时,其他用户无法编辑文档,而只能查看文档

如何实现这一点

代码是:

library(shiny)
library(shinyAce)
library(stringi)

ui <- fluidPage(
  br(),
  uiOutput("aceEditor1"),
  downloadButton('save1', 'Save editor content')
)

server <- function(input, output, session)
{
  output$aceEditor1 <- renderUI(
  {
    aceEditor(outputId = "ace1", 
              value = paste(stri_rand_lipsum(3), collapse="\n\n"),
              mode = "r", 
              height = "500px", 
              fontSize = 17, 
              theme = "chrome", 
              wordWrap = TRUE)
  })

  output$save1 <- downloadHandler (
    filename = function() 
    { 
      "result.txt" 
    },

    content = function(file) 
    { 
       write.table(x = input$ace1, file = file, sep = "", row.names = FALSE, col.names = FALSE, quote = FALSE) 
    }
  )
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(新亚斯)
图书馆(stringi)

ui您可以通过引入键来实现这一点。本质上,我们创建了一个对所有会话都可见的全局键变量。当会话启动时,它接受密钥并将全局变量设置为不可用

当新会话连接并尝试获取密钥时,但该密钥不可用

在服务器功能中,我们可以在执行“关键部分”代码之前进行检查

这基本上是半音旗工作原理的基础

最后,当第一个会话的会话结束时,它返回全局变量的键

我们还可以更进一步,使用
invalidaterater()
定期检查密钥是否可用

要运行下面的虚拟示例,请首先运行以下命令:

write_csv(mtcars,"~/Desktop/data.csv")
应用程序如下所示:

library(shiny)


key_available <- TRUE

ui <- fluidPage(
  br(),
  textInput(inputId = "text_input","Text Input"),
  actionButton(inputId = "add_col","Add Column"),
  dataTableOutput("table_output"),
  downloadButton('save1', 'Save editor content')
)

server <- function(input, output, session){

  onSessionEnded(function() key_available <<- TRUE)

  # Session starts, Read data in
  have_key <- FALSE

  observe({
    invalidateLater(1000)

    if(key_available){
      key_available <<- FALSE
      have_key <<- TRUE
    }

  })

  data_reactive <- eventReactive(c(input$add_col),{
    data <- read_csv("~/Desktop/data.csv")
    if(have_key){
      data[[input$text_input]] <- NA
      write_csv(data,"~/Desktop/data.csv")
    }

    return(data)
  })


  output$table_output <- renderDataTable({
    req(data_reactive())
    data_reactive()
    })


}

shinyApp(ui = ui, server = server)

库(闪亮)

键可用您可以通过引入键来实现这一点。本质上,我们创建了一个对所有会话都可见的全局键变量。当会话启动时,它接受密钥并将全局变量设置为不可用

当新会话连接并尝试获取密钥时,但该密钥不可用

在服务器功能中,我们可以在执行“关键部分”代码之前进行检查

这基本上是半音旗工作原理的基础

最后,当第一个会话的会话结束时,它返回全局变量的键

我们还可以更进一步,使用
invalidaterater()
定期检查密钥是否可用

要运行下面的虚拟示例,请首先运行以下命令:

write_csv(mtcars,"~/Desktop/data.csv")
应用程序如下所示:

library(shiny)


key_available <- TRUE

ui <- fluidPage(
  br(),
  textInput(inputId = "text_input","Text Input"),
  actionButton(inputId = "add_col","Add Column"),
  dataTableOutput("table_output"),
  downloadButton('save1', 'Save editor content')
)

server <- function(input, output, session){

  onSessionEnded(function() key_available <<- TRUE)

  # Session starts, Read data in
  have_key <- FALSE

  observe({
    invalidateLater(1000)

    if(key_available){
      key_available <<- FALSE
      have_key <<- TRUE
    }

  })

  data_reactive <- eventReactive(c(input$add_col),{
    data <- read_csv("~/Desktop/data.csv")
    if(have_key){
      data[[input$text_input]] <- NA
      write_csv(data,"~/Desktop/data.csv")
    }

    return(data)
  })


  output$table_output <- renderDataTable({
    req(data_reactive())
    data_reactive()
    })


}

shinyApp(ui = ui, server = server)

库(闪亮)

key_可用也许您可以定义一个全局变量(在
服务器
函数之外),当有人进入/退出编辑器时,该变量会更改T/F(我不熟悉该小部件的细节)。然后在进入编辑器之前检查变量,如果其他人没有退出,则不允许使用该变量。请参阅。Ace编辑器的使用就是一个可以在线编辑的示例。但重要的是,当有人在编辑器中编辑文档时,其他用户不能同时干预并开始编辑该文档。实际上,代码不是一个很好的例子,要编辑的文档应该是存储在服务器上某处的文档。也许您可以定义一个全局变量(在
服务器
函数之外),当有人进入/退出编辑器时更改T/F(我不熟悉该小部件的细节)。然后在进入编辑器之前检查变量,如果其他人没有退出,则不允许使用该变量。请参阅。Ace编辑器的使用就是一个可以在线编辑的示例。但重要的是,当有人在编辑器中编辑文档时,其他用户不能同时干预并开始编辑该文档。实际上,代码不是一个很好的例子,要编辑的文档应该是存储在服务器上某个位置的文档。这是使用
的罕见次数之一这是使用