R语言 我的闪亮代码有什么问题,没有吐出ggplot图?

vtwuwzda  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(114)

我是制作闪亮应用程序的新手。本质上我是在尝试制作一个闪亮的应用程序,它可以做到以下几点:

  1. ui允许你从本地计算机装入df
    1.读取DF,然后用户可以从下拉菜单中选择两个其他输入- Dataframe 中的列名,以绘制ggplot
    1.给出输出ggplot
    以下是正在发生的事情
  2. DF被精细地读取
  3. UI中的下拉选择菜单输入工作正常
  4. ggplot就是没有React
    下面是我的代码:
library(shiny)
library(readxl)
library(ggplot2)
library(dplyr)

ui <- fluidPage(
  titlePanel("Upload Excel Sheet"),
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose Excel Sheet",
                accept = c(
                  "text/csv",
                  "text/comma-separated-values,text/plain",
                  ".csv")),
     selectInput("x", "X-axis", choices = ""),
     selectInput("y", "Y-axis", choices = "")
     ),
    mainPanel(
      plotOutput("plot1")
    )
  )
)

server <- function(input, output,session) {
  data <- reactive({
    inFile <- input$file1
        if (is.null(inFile))
      return(NULL)
        read_excel(inFile$datapath)
  })
  observe({
    updateSelectInput(session, "x", choices = names(data()))
    updateSelectInput(session, "y", choices = names(data()))
  })
  
  output$plot1<- renderPlot({
    data()%>%ggplot(aes(x=input$x, y=input$y))+geom_bar(stat="identity"))
  })
}

shinyApp(ui = ui, server = server)

我尝试过的:
1.我用一个表输出(renderTable)替换了绘图输出(renderPlot),看到代码"读取" df并输出表。
1.我已经在一段单独的代码(read_excel)中将df拉到R中,然后对它运行ggplot命令,它似乎工作得很好。
我觉得我错过了一些明显的东西,也许是一些关键的基本。如果可能的话,请尝试在任何excel工作表在您的本地目录的代码。

e4yzc0pl

e4yzc0pl1#

这里有几点需要调整。

  1. geom_bar(stat="identity"))有一个额外的右圆括号,已删除。
  2. ggplot2美学需要要么是非标准的评价 * 符号 *(这里不可行),要么我们需要使用这里描述的技术: 也就是.data[[varname]](带有字符串)或{{ varname }}(带有用户提供的NSE符号)。https://ggplot2.tidyverse.org/articles/ggplot2-in-packages.html#using-aes-and-vars-in-a-package-function-1. Namely, .data[[varname]] (with strings) or {{ varname }} (with user-provided NSE symbols). We'll use the former here.
    一些可选的东西可以提高弹性(以及良好的代码实践):
    1.我建议自由地使用req(.)。请看我的例子。它不仅处理了一些你必须处理的if (is.null(..)),它还非常好地处理了下游的React性。
    1.您允许使用".csv",但始终使用read_excel,我通过包含一个简单的if修复了这个问题。
    密码。
server <- function(input, output,session) {
  data <- reactive({
    req(inFile <- input$file1$datapath)
    if (grepl("csv$", inFile)) {
      read.csv(inFile)
    } else {
      read_excel(inFile$datapath)
    }
  })
  observe({
    updateSelectInput(session, "x", choices = names(data()))
    updateSelectInput(session, "y", choices = names(data()))
  })
  
  output$plot1<- renderPlot({
    req(data(), input$x, input$y)
    data() %>%
      ggplot(aes(x=.data[[ input$x ]], y=.data[[ input$y ]])) +
      geom_bar(stat="identity")
  })
}

扩展:除了req之外,我还建议您熟悉一下validateneed,例如,如果我们将您的data <- reactive(.)更新为:

data <- reactive({
    req(inFile <- input$file1$datapath)
    if (grepl("csv$", inFile)) {
      out <- readr::read_csv(inFile)
    } else {
      out <- readr::read_excel(inFile$datapath)
    }
    isnum <- sapply(out, is.numeric)
    validate(
      need(sum(isnum) >= 2, "We need at least two numeric columns")
    )
    out
  })

(* 并且在其他地方没有其他改变 *),那么所有依赖的React性块都"看到"问题。例如,如果我给CSV提供的数字列不足,我们会看到

我们通常会看到

(其中的情节是窥视出底部)。

相关问题