【问题标题】:Shiny : make a functional app integrable as an iframeShiny :使功能性应用程序可集成为 iframe
【发布时间】:2020-12-13 21:34:46
【问题描述】:

我想在我上传到 cran 上的一个包中编写一个闪亮的扩展,它接受一个对象并允许各种操作。因此,该应用程序是一个功能性应用程序,这种类型:

ui <- function(x) fluidPage(
    titlePanel(paste("displaying", x, "*m")),
    sidebarLayout(
        sidebarPanel(
            sliderInput("m",
                        "m:",
                        min = 1,
                        max = 50,
                        value = 30)
        ),
        mainPanel(textOutput("product"))
    )
)
server <- function(x) {
    function(input, output) {
        output$product <- renderText(as.character(x*input$m))
    }
}
run_app <- function(x) runApp(shinyApp(ui = ui(x), server = server(x)))
run_app(4)

(我已经复制了我在精彩的 vdiffr 包中看到的样式)

它具有优美的可读性。但是,这种函数式编写有一个限制:据我所知,它不能作为独立应用程序运行,因此不能作为 iframe 部署和集成(我希望能够在我的包之外上传到 cran,以便能够将其集成到我公司更大的闪亮仪表板中,而无需复制/粘贴/修改代码)。

有没有一种协调两个视图的好方法,即一些 fine 方法来编写也可以作为独立运行的闪亮函数(您可以从更大的应用程序内部修改函数输入) ?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    为什么不能在 iframe 中查看作为函数提供的闪亮应用?

    这是一个简单的单个文件示例,使用callr 为内部应用程序生成另一个 R 会话。根据您托管应用程序的方式,这可能不是必需的 - 您只需要内部应用程序的 URL。

    library(shiny)
    library(callr)
    
    callr::r_bg(function(myArg) {
      
      library(shiny)
      
      ui <- fluidPage(
        p(paste("inner app:", myArg)),
      )
      
      server <- function(input, output, session) {}
      
      app <- shinyApp(ui, server)
      
      runApp(app, host = "0.0.0.0", port = 8080)
      
    }, args = list(myArg = 4), supervise = TRUE)
    
    ui <- fluidPage(
      p("outer app"),
      tags$iframe(src="http://127.0.0.1:8080", scrolling="yes") # , height="900vh", width="100%", frameborder="0"
    )
    
    server <- function(input, output, session) {}
    
    shinyApp(ui, server)
    

    此外,您可能想查看shiny modules

    【讨论】:

    • 感谢您的回答,r_bg 可能是解决方案的一部分但是,拥有一个功能性应用程序的重点是使用来自全球应用程序内部的 arg 来调用它,例如:@ 987654327@ 我不能让它这样工作,看起来 callr 对反应值不太好。 (顺便说一句,我知道我的代码即使有效也不美观)
    • callr 只是从一个文件中生成两个闪亮的应用程序以表明 iframe 工作正常的一种方法 - 如上所述,您不需要它,您可以生成两个 R 会话并意识到同样的。还是您的问题是,如何将反应从一个闪亮的应用传递到另一个?
    • 这就是问题所在。也许两个应用程序之间的分离是错误的,我应该尝试一个模块,该模块依赖于来自 ar 对象(如果模块是通过函数调用)或来自高级闪亮应用程序(如果模块是通过应用程序调用)的反应值)。
    • 是的,听起来您正在寻找模块。两个闪亮的应用程序之间的通信肯定是可能的,但需要interprocess communication 结合上述 iframe 方法,这似乎是在重新发明轮子。
    • 不过,以上是否回答了您最初的问题?
    猜你喜欢
    • 2020-12-13
    • 2016-10-09
    • 2013-02-19
    • 2012-09-06
    • 1970-01-01
    • 2019-04-13
    • 2020-03-26
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多