闪亮:使功能应用程序可集成为iframe

时间:2020-08-25 08:14:50

标签: r shiny

我想在我上传到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 方法来编写也可以独立运行的闪亮功能(您可以在较大的应用程序内部修改功能输入)?

1 个答案:

答案 0 :(得分: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)

result

此外,您可能希望研究shiny modules