R语言 如何从动态输入创建打印?

t40tm48m  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(147)

你好,我是shiny编程的新手。我目前正在开发一个应用程序,用户可以上传数据,然后选择应该绘制哪些变量。在这里,我遇到了ggplot只返回空图的问题。这不仅适用于我的特定数据集,而且当我使用iris数据集时,也会出现同样的错误。以下是我的应用程序文档:

library(shiny)
library(ggplot2)
library(tidyverse)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("Plot Data"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
                    selectInput(inputId = "x_input",
                      choices = "",
                      label = "Choose x-Axis",
                      multiple = FALSE,
                      selectize = TRUE),
          selectInput(inputId = "y_input",
                      choices = "",
                      label = "Choose y-Axis",
                      multiple = FALSE,
                      selectize = TRUE)
        ),
        # Show a plot of the generated distribution
        mainPanel("Sample of Input Data",
           
           tableOutput("table"),
           "Plot of Input Data",
           plotOutput("plot")

        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output, session) {

  output$table = renderTable({
    #req(combined_df)
    return(head(iris))
  })
  
  observe({
    updateSelectInput(
      session,
      "y_input",
      choices=names(iris))
  })
  
  observe({
    updateSelectInput(
      session,
      "x_input",
      choices=names(iris))
  })
  
  output$plot = renderPlot({
    iris %>% 
      plot()
   # plot = iris %>% 
   #         ggplot(aes(x = input$x_input, y = input$y_input))
   # print(plot)

    })   

  
}
# Run the application 
shinyApp(ui = ui, server = server)

关于我如何制定output$plot命令,我得到了不同的错误/问题。
1.将base R与plot()配合使用:

output$plot = renderPlot({
    iris %>% 
      plot(x = input$x_input, y = input$y_input)

    })

其给出以下误差:

Warning: Error in plot.window: need finite 'xlim' values
  173: plot.window
  172: localWindow
  171: plot.default
  170: plot
  169: %>%
  168: renderPlot [dirrectory....]
  166: func
  126: drawPlot
  112: <reactive:plotObj>
   96: drawReactive
   83: renderFunc
   82: output$plot
    1: shiny::runApp

2.如果我没有使用base R指定x和y值,我会得到一个绘图输出:

output$plot = renderPlot({
    iris %>% 
      plot()
})

参见Here。这也是不令人满意的,因为我只想要一个单一的xy图。
3.使用ggplot()

output$plot = renderPlot({
  plot = iris %>% 
          ggplot(aes(x = input$x_input, y = input$y_input))
})

我得到了一个没有任何数据点的空图。如果我把ggplot()函数 Package 在print()show()语句中,或者根本没有,这将保持不变。
4.最后一个组合是数字3的变体,也使用ggplot()

output$plot = renderPlot({
  plot = iris %>% 
          ggplot(aes(x = input$x_input, y = input$y_input))+
           geom_point()
})

这将返回一个中间有一个点的otherwis空图(参见here)。
重要提示:不管是否使用tidyverse封装/符号,这些误差保持相同。
在这一点上,我运行的想法如何解决这个看似简单的问题,所以任何帮助将是非常感谢。谢谢!

qojgxg4l

qojgxg4l1#

两件事:
1.我们需要将input$ Package 为.data[[]](或者 Package 为!! sym())。
1.单独调用ggplot是不够的,我们还需要geom_point()

library(shiny)
library(ggplot2)
library(tidyverse)

# Define UI for application that draws a histogram
ui <- fluidPage(
  
  # Application title
  titlePanel("Plot Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "x_input",
                  choices = "",
                  label = "Choose x-Axis",
                  multiple = FALSE,
                  selectize = TRUE),
      selectInput(inputId = "y_input",
                  choices = "",
                  label = "Choose y-Axis",
                  multiple = FALSE,
                  selectize = TRUE)
    ),
    # Show a plot of the generated distribution
    mainPanel("Sample of Input Data",
              
              tableOutput("table"),
              "Plot of Input Data",
              plotOutput("plot")
              
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output, session) {
  
  output$table = renderTable({
    #req(combined_df)
    return(head(iris))
  })
  
  observe({
    updateSelectInput(
      session,
      "y_input",
      choices=names(iris))
  })
  
  observe({
    updateSelectInput(
      session,
      "x_input",
      choices=names(iris))
  })
  
  output$plot = renderPlot({
    iris %>%
      ggplot(aes(x = .data[[input$x_input]],
                 y = .data[[input$y_input]])) + 
      geom_point()
    
    
  })   
  
  
}
# Run the application 
shinyApp(ui = ui, server = server)

相关问题