Вызов графа с другого листа в R - PullRequest
1 голос
/ 07 апреля 2020

Мое приложение Shiny становится немного длиннее, так как я рисую различные графики на нескольких панелях. Соответственно, чтобы помочь некоторым организациям, мне было интересно, можно ли было переместить код для графиков в отдельный r-скрипт и вызвать эти графики из исходного r-скрипта.

Добавляя некоторые дополнительные сложности, графики, которые я бы хотел отобразить, требуют ввода данных пользователем из приложения Shiny.

Можно ли использовать код из другого скрипта в R для построения графиков и, если да, то как? Кроме того, поскольку будет несколько графиков, можно ли указать, какой граф из нового r-скрипта будет go в указанном месте, или мне нужно будет создать отдельный r-скрипт для каждого графа (что приведет к поражению цель усиленного организационного надзора)?

Я написал несколько упрощенных, воспроизводимых кодов (см. ниже), которые, я надеюсь, дадут вам представление о том, что я ищу. По сути, я хотел бы, чтобы любой код, который создает график в renderPlot (), поступал из отдельного r-скрипта.

Большое спасибо за любую помощь!

library(shiny)

ui <- fluidPage(
  mainPanel(
    selectInput("input1","Select an option",choices = c("First","Second")),
    plotOutput("plot1"),
    plotOutput("plot2")
  )
)

server <- function(input, output, session) {
  output$plot1 = renderPlot({
    if(input$input1=="First"){
      ##This is where I'd like to call the code for the graph from another sheet.
      plot(1,main = input$input1)
    }
    if(input$input1=="Second"){
      ##Again, this is where I'd like to code for the graph from another sheet.
      plot(2,main = input$input1)
    }
  })

  output$plot2 = renderPlot({
    if(input$input1=="First"){
      ##This is where I'd like to call the code for the graph from another sheet.
      plot(1*rnorm(1,10,2),main = input$input1)
    }
    if(input$input1=="Second"){
      ##Again, this is where I'd like to code for the graph from another sheet.
      plot(2*rnorm(1,50,2),main = input$input1)
    }
  })


}

shinyApp(ui, server)


1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете создать функцию, которая принимает аргументы для создаваемого графика, например данные и заголовок графика, а затем передает эти аргументы в код, который создает график. Например, скажем, единственное, что изменяется, это x и заголовок графика, вы можете определить функцию, которая принимает эти аргументы, а затем использует их в коде для построения графика. Затем вы сохраняете это в отдельном скрипте и вызываете скрипт, используя source() в своем блестящем приложении.

plots.R

plot_data <- function(x, y=NULL, plot.title){

  if(is.null(y)) {
    y <- seq(from = 1, by = 1, length.out = length(x))
  }

  plot(x, y, main = plot.title)

}

Загрузите функцию в глобальную среду, используя source('plots.R') , убедитесь, что plots.R сохранен в том же месте, что и ваше блестящее приложение.

library(shiny)

source("plots.R")

ui <- fluidPage(
  mainPanel(
    selectInput("input1","Select an option",choices = c("First","Second")),
    plotOutput("plot1"),
    plotOutput("plot2")
  )
)

server <- function(input, output, session) {
  output$plot1 = renderPlot({
    if(input$input1=="First"){
      ##This is where I'd like to call the code for the graph from another sheet.
      plot_data(1, plot.title = input$input1)
    }
    if(input$input1=="Second"){
      ##Again, this is where I'd like to code for the graph from another sheet.
      plot_data(2, plot.title = input$input1)
    }
  }) 

  output$plot2 = renderPlot({
    if(input$input1=="First"){
      ##This is where I'd like to call the code for the graph from another sheet.

      plot_data(1*rnorm(1,10,2),plot.title = input$input1)

    }
    if(input$input1=="Second"){
      ##Again, this is where I'd like to code for the graph from another sheet.
      plot_data(2*rnorm(1,50,2),plot.title = input$input1)
    }
  })


}

shinyApp(ui, server)

Конечно, это не выглядит большой разницей, но со сложными графиками, которые занимают несколько строк, поворачивая Сюжетный код в функцию превратит несколько строк в одну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...