首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话如何在shiny-server中工作?

会话如何在shiny-server中工作?
EN

Stack Overflow用户
提问于 2016-12-22 01:57:14
回答 1查看 15.4K关注 0票数 17

我在理解会话如何在闪亮的服务器中工作时遇到了一些麻烦。我假设会话在用户关闭浏览器时结束,但是,通过在服务器函数中使用print(session$isClosed()),我在开始时得到一个FALSE响应(所以好的),然后当我关闭浏览器时什么也没有发生。有谁能给我一些关于闪亮服务器会话的提示吗?我想存储特定于会话的绘图,让用户只下载他们的绘图。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-22 07:53:34

好的,首先,一个闪亮的会话对象是一个在闪亮中的特定('R6')数据结构,由公有和私有元素组成。它的目的是记录一个用户和shiny之间的关系的一个实例(稍后将对此进行详细介绍)。

代码语言:javascript
复制
>str(session)
Classes 'ShinySession', 'R6' <ShinySession>
  Public:
    @uploadEnd: function (jobId, inputId) 
    @uploadieFinish: function () 
    @uploadInit: function (fileInfos) 
    allowReconnect: function (value) 
    clientData: reactivevalues
    clone: function (deep = FALSE) 
    close: function () 
    closed: FALSE
    decrementBusyCount: function () 
    defineOutput: function (name, func, label) 
    dispatch: function (msg) 
    doBookmark: function () 
    downloads: Map, R6
    exportTestValues: function (..., quoted_ = FALSE, env_ = parent.frame()) 
    files: Map, R6
    fileUrl: function (name, file, contentType = "application/octet-stream") 
    flushOutput: function () 
    freezeValue: function (x, name) 
    getBookmarkExclude: function () 
    getTestEndpointUrl: function (inputs = TRUE, outputs = TRUE, exports = TRUE, format = "rds") 
    groups: NULL
    handleRequest: function (req) 
    incrementBusyCount: function () 
    initialize: function (websocket) 
    input: reactivevalues
    isClosed: function () 
    isEnded: function () 
    makeScope: function (namespace) 
    manageHiddenOutputs: function () 
    manageInputs: function (data) 
    ns: function (id) 
    onBookmark: function (fun) 
    onBookmarked: function (fun) 
    onEnded: function (endedCallback) 
    onFlush: function (flushCallback, once = TRUE) 
    onFlushed: function (flushedCallback, once = TRUE) 
    onInputReceived: function (callback) 
    onRestore: function (fun) 
    onRestored: function (fun) 
    onSessionEnded: function (sessionEndedCallback) 
    output: shinyoutput
    outputOptions: function (name, ...) 
    progressStack: environment
    reactlog: function (logEntry) 
    registerDataObj: function (name, data, filterFunc) 
    registerDownload: function (name, filename, contentType, func) 
    reload: function () 
    request: environment
    resetBrush: function (brushId) 
    restoreContext: RestoreContext, R6
    rootScope: function () 
    saveFileUrl: function (name, data, contentType, extra = list()) 
    sendBinaryMessage: function (type, message) 
    sendCustomMessage: function (type, message) 
    sendInputMessage: function (inputId, message) 
    sendInsertUI: function (selector, multiple, where, content) 
    sendModal: function (type, message) 
    sendNotification: function (type, message) 
    sendProgress: function (type, message) 
    sendRemoveUI: function (selector, multiple) 
    session: active binding
    setBookmarkExclude: function (names) 
    setShowcase: function (value) 
    showProgress: function (id) 
    singletons: 
    token: d44d583f13b3cd4ccce43f59fe410f61
    unhandledError: function (e) 
    updateQueryString: function (queryString) 
    user: NULL
    wsClosed: function () 
  Private:
    .clientData: ReactiveValues, R6
    .input: ReactiveValues, R6
    .outputOptions: list
    .outputs: list
    bookmarkCallbacks: environment
    bookmarkedCallbacks: environment
    bookmarkExclude: 
    busyCount: 2
    closedCallbacks: environment
    createBookmarkObservers: function () 
    enableTestEndpoint: function () 
    fileUploadContext: environment
    flushCallbacks: environment
    flushedCallbacks: environment
    getOutputOption: function (outputName, propertyName, defaultValue) 
    inputMessageQueue: list
    inputReceivedCallbacks: environment
    invalidatedOutputErrors: Map, R6
    invalidatedOutputValues: Map, R6
    outputValues: list
    progressKeys: character
    registerSessionEndCallbacks: function () 
    restoreCallbacks: environment
    restoredCallbacks: environment
    sendErrorResponse: function (requestMsg, error) 
    sendMessage: function (...) 
    sendResponse: function (requestMsg, value) 
    shouldSuspend: function (name) 
    showcase: FALSE
    storeOutputValues: function (values = NULL) 
    testEndpointUrl: session/d44d583f13b3cd4ccce43f59fe410f61/dataobj/shinyte ...
    testValueExprs: list
    websocket: WebSocket
    write: function (json) 

探索session对象的一个好方法是使用 shiny example in shiny gallery client-data-and-query-string。它允许see包含的内容,例如,在session$clientdata或对象的任何其他元素中。

几个额外的和误导性的微不足道的观点:

  • 会话何时启动?当用户使用闪亮的应用程序
  • 连接时,会话何时结束?当用户与闪亮的应用程序

断开连接时

例如,为了显示问题实际上是如何相当复杂的,如果我刷新浏览器,我将结束当前会话并创建一个新会话。

关于session$isClosed(),这不是在会话结束时连接到特定操作的正确函数。这实际上是一个闪亮的回调函数的角色

代码语言:javascript
复制
onSessionEnded(fun, session = getDefaultReactiveDomain())

下面是一个最小的例子:

代码语言:javascript
复制
library(shiny)

ui =(
  fluidPage(
    titlePanel("This is an example")
  )
)

server = function(input, output, session){
  session$onSessionEnded({
    print("Stop!")
    stopApp   
  }) 
}

runApp(list(ui = ui, server = server))

如果您尝试刷新(或与浏览器()断开)将打印“停止”,并将停止应用程序。

2017年9月26日编辑:

一般来说,我认为如果会话的连续性很重要(而且在任何情况下,直接在Shiny ServerShiny Server Pro上测试session代码都是合适的),最好还是要小心。最重要的用例可能来自Shiny Server Pro,任何断开连接的may都会影响登录状态等)。

我还注意到,shiny团队在最近的版本中对这些方面进行了更改。例如,似乎虽然onSessionEnded仍然可以工作,但它可能不再是这个用例的最佳函数。

请看以下代码作为示例(来自shiny参考指南),使用onStop,它可以在会话结束时以及应用程序停止时工作。

代码语言:javascript
复制
library(shiny)

cat("Doing application setup\n")
 onStop(function() {
   cat("Doing application cleanup\n")
 })

 shinyApp(
   ui = basicPage("onStop demo"),

   server = function(input, output, session) {
     onStop(function() cat("Session stopped\n"))
   }
 )
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41269024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档