R 向全球环境传递反应式数据

R 向全球环境传递反应式数据,r,shiny,r-markdown,R,Shiny,R Markdown,我想在RMarkdown中使用Shiny,以便用户上传数据(xlsx文件)。 然后,我希望将所有工作表作为R数据帧(不带反应性)传递,以运行RMarkdown文件的其余部分。 我主要想把它们转换成数据帧,这样我就可以使用networkite来运行Python代码 我试过这个,但似乎不太管用: library(dplyr) library(miniUI) library(shiny) library(XLConnect) launch_shiny <- function() { u

我想在RMarkdown中使用Shiny,以便用户上传数据(xlsx文件)。
然后,我希望将所有工作表作为R数据帧(不带反应性)传递,以运行RMarkdown文件的其余部分。
我主要想把它们转换成数据帧,这样我就可以使用
networkite
来运行Python代码

我试过这个,但似乎不太管用:


library(dplyr)
library(miniUI)
library(shiny)
library(XLConnect)

launch_shiny <- function() {

  ui <- miniPage(
    gadgetTitleBar("Input Data"),
    miniContentPanel(
      fileInput(inputId = "my.file", label = NULL, multiple = FALSE)
    )
  )

  server <- function(input, output, session) {
    wb <- reactive({
      new.file <- input$my.file
      loadWorkbook(
        filename = new.file$datapath,
        create = FALSE,
        password = NULL
      )
    })

    observeEvent(input$done, {
      stopApp(c(wb()))
    })

  }
  runGadget(ui, server)

}

test <- launch_shiny()
df1 <- readWorksheet(object = test, sheet = "sheet1")
df2 <- readWorksheet(object = test, sheet = "sheet2")
我可以使用stopApp(readsheet(object=wb(),sheet=“sheet1”)一次返回一张工作表,但我似乎不能同时返回整个工作簿或多个数据帧

我真的不想在xlsx中读取,在工作目录中将每张工作表保存为csv,然后再次读取这些文件。

有人对如何解决这个问题有什么好的建议吗?

文件输入()的文档详细说明如下:

数据通路

包含已删除数据的临时文件的路径 上传。如果用户执行另一次上载,则可能会删除此文件 手术

这意味着输入变量中给定的
datapath
是一个临时文件,在您关闭应用程序后将不再可访问,这是函数
readsheet
将尝试执行的操作

因此,您必须阅读服务器中的工作表,并以某种方式返回数据帧。 我通过定义第二个反应值来实现这一点,该值基本上是通过在
wb
中的所有工作表上应用
lappy
返回的数据帧列表,在这种情况下,
test
将是此数据帧列表

可能有其他方法(更有效,或更适合您的目的)来实现这一点,但这里是:

library(dplyr)
library(miniUI)
library(shiny)
library(XLConnect)

launch_shiny <- function() {

  ui <- miniPage(
    gadgetTitleBar("Input Data"),
    miniContentPanel(
      fileInput(inputId = "my.file", label = NULL, 
                multiple = FALSE)
    )
  )

  server <- function(input, output, session) {
    wb <- reactive({
      new.file <- input$my.file
      loadWorkbook(
        filename = new.file$datapath,
        create = FALSE,
        password = NULL
      )
    })

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    df_lst <- reactive({
      # read all sheets into a list
      lapply(getSheets(wb()), 
             function(sheet){
               readWorksheet(object = wb(), 
                             sheet = sheet)
             })
    })
   # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    observeEvent(input$done, {
      # get the list of dfs from the app
      stopApp(c(df_lst())) 
    })

  }
  runGadget(ui, server)
  }

test <- launch_shiny()
库(dplyr)
图书馆(miniUI)
图书馆(闪亮)
库(XLConnect)

发射你聪明!我本应该考虑返回一个列表,因为我对数据帧非常感兴趣。太好了,非常感谢!很乐意帮忙!:)
library(dplyr)
library(miniUI)
library(shiny)
library(XLConnect)

launch_shiny <- function() {

  ui <- miniPage(
    gadgetTitleBar("Input Data"),
    miniContentPanel(
      fileInput(inputId = "my.file", label = NULL, 
                multiple = FALSE)
    )
  )

  server <- function(input, output, session) {
    wb <- reactive({
      new.file <- input$my.file
      loadWorkbook(
        filename = new.file$datapath,
        create = FALSE,
        password = NULL
      )
    })

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    df_lst <- reactive({
      # read all sheets into a list
      lapply(getSheets(wb()), 
             function(sheet){
               readWorksheet(object = wb(), 
                             sheet = sheet)
             })
    })
   # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    observeEvent(input$done, {
      # get the list of dfs from the app
      stopApp(c(df_lst())) 
    })

  }
  runGadget(ui, server)
  }

test <- launch_shiny()