如何在R Shiny应用程序中使用工作区对象

时间:2018-10-03 07:35:05

标签: r shiny

我希望用户能够输入数据框对象的名称,并将该对象呈现为Shiny应用程序中的格式化数据表。

这是一个玩具示例。工作空间中有两个数据框对象:df1df2。当用户键入df1时,我希望呈现该数据框。同样,对于df2或它们在工作区中具有的任何其他数据框。

我怀疑我必须在环境,范围界定或评估方面做些事情,但是我不确定该怎么做。

我已在代码中注释了我可以在内置mtcars数据集中进行硬编码并正确渲染的代码。现在,我只希望能够对用户工作空间中的任何临时数据框执行相同的操作。

library(shiny)
set.seed(1234)

x <- sample.int(n = 20)
y <- sample(x = LETTERS, size = 20)
a <- rnorm(n = 20)
b <- sample(x = letters, size = 20)

df1 <- data.frame(x = x, y = y)
df2 <- data.frame(a = a, b = b)


# Define UI ----
ui <- fluidPage(
  titlePanel("Using text inputs to select dataframes"),

  sidebarLayout(position = "left",
                sidebarPanel(width = 5,
                            textInput("dfInput", h5("Enter name of dataframe"),
                                                value = "")),

                mainPanel(width = 6,
                          h4("Here's your data"),
                          textOutput("selected_df"),
                          dataTableOutput("view")
                )

  )
)


# Define server logic ----
server <- function(input, output, session) {

  output$selected_df <- renderText({
    paste("You have selected ", input$dfInput)
  })

  output$view <-
    renderDataTable({
      input$dfInput # this should render the selected dataframe. If you replace this with mtcars then that dataset is correctly rendered.
    })

}


# Run the app ----
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:2)

我们将首先获取全局环境中的所有数据帧,然后使用get来访问对象。我将textInput更改为selectInput,所以您不需要键入任何内容,可能会出错。此外,我从datasets包中添加了数据,但是您应该构建更多的测试用例来检查数据是否存在

library(shiny)
set.seed(1234)

x <- sample.int(n = 20)
y <- sample(x = LETTERS, size = 20)
a <- rnorm(n = 20)
b <- sample(x = letters, size = 20)

df1 <- data.frame(x = x, y = y)
df2 <- data.frame(a = a, b = b)

mydataframes <- names(which(unlist(eapply(.GlobalEnv,is.data.frame))))
OpenData <- data()$results[,3]

#Define UI ----
ui <- fluidPage(
  titlePanel("Using text inputs to select dataframes"),

  sidebarLayout(position = "left",
                sidebarPanel(width = 5,
                             selectInput("dfInput","Select Dataframe",
                               #choices = mydataframes,

                               list("Your Datasets" = c(mydataframes),
                                    "R Datasets" = c(OpenData),


                               selected=NULL))),

                mainPanel(width = 6,
                          h4("Here's your data"),
                          textOutput("selected_df"),
                          dataTableOutput("view")
                )

  )
)


# Define server logic ----
server <- function(input, output, session) {

  output$selected_df <- renderText({
    paste("You have selected ", input$dfInput)
  })

  output$view <-
    renderDataTable({
      as.data.frame(get(input$dfInput)) # this should render the selected dataframe. If you replace this with mtcars then that dataset is correctly rendered.
    })

}


# Run the app ----
shinyApp(ui = ui, server = server)

enter image description here