如何从一个返回Shiny

时间:2017-11-09 04:12:59

标签: r ggplot2 shiny shiny-server

我有一个r脚本包含一个Identify_IP(),它返回一个dataframe和ggplot列表。我想调用脚本并渲染数据框和绘图。

这是Identify_IP()函数。我取消了不相关的代码,只保留了plot,lines和ggplot代码,给出了我的ggplot类型的清晰示例。

library(ggplot2)
library(matrixStats)
library(fda.usc)

#df <- read.table("name.XLS", header = FALSE)

Identify_IP = function(df1){
  mlearn <- df1[,'V7']
     formul <- plot(blue_curve$x, blue_curve$y * 30, type = 'l', col = 'blue')

  formula_deriv <- lines(blue_curve$x, red_curve$y1 * 30, col = 'red')

  p <- ggplot(df1, aes(blue_curve$x)) + 
    geom_line(aes(y = blue_curve$y, colour = "0 Deriv")) + 
    geom_line(aes(y = red_curve$y1, colour = "1st Deriv")) + 
    geom_vline(xintercept = x_loc) + geom_hline(yintercept = 0)


  return(list(df1,p))

}

现在,这是一个基于amrr和micstr建议的修改后的Shiny代码。

 source('InflectionP2.R', local = TRUE)

library(ggplot2)
library(shiny)
runApp(
  list(
    ui = fluidPage(
      titlePanel("Upload your file"),
      sidebarLayout(
        sidebarPanel(
          fileInput('file1', 'Choose xls file',
                    accept = c(".XLS")),

      actionButton("btn", "Update Table"),
      actionButton("btn1", "Display Plot")

    ),

    mainPanel(

      tableOutput('what'),
      plotOutput('pl'))
  )

)
,

server = function(input, output, session){

  dataOP <- reactive({
    inFile <- input$file1
    if (is.null(input$file1))
      return(NULL)

    dfs <- Identify_IP(read.table(inFile$datapath))

    return(dfs)
  })


  observeEvent(input$btn, output$what <-  renderTable({

    dataOP()[[1]]

  }))

  observeEvent(input$btn1, output$pl <- renderPlot({

    pp <- dataOP()

    pp[[2]]

  }))             
}))

这对于教我如何在reactive()中调用r脚本非常有帮助。这对我来说很有意义。然而,它渲染表格,但“显示绘图”按钮不会渲染绘图。 Identify_IP函数中的ggplot是否与无法显示绘图有关?我也试过print(ggplot(pp [[2]]))并且仍然一样。

2 个答案:

答案 0 :(得分:1)

我设法让这个工作。

注意我使用了内部数据集iris并制作了玩具Identify_IP功能,因为我没有您的代码。

请注意,您仍然需要选择一个文件来触发事件,但它会忽略该文件并使用iris数据。

解决方法我使用[[1]]来获取表格dataOP()$tble

<强> CODE

library(shiny)
library(ggplot2)

# source('InflectionP2.R', local = TRUE)
# MAKE TEST FUNCTION
Identify_IP <- function(mydata) {

  #shrink data
  tble <- head(mydata)

  plt <-  ggplot(data = head(mydata),
                 mapping = aes(y = Sepal.Length,
                               x = Petal.Length)) + geom_point()

  return(list(tble, plt))
}




runApp(
  list(
    ui = fluidPage(
      titlePanel("Upload your file"),
      sidebarLayout(
        sidebarPanel(
          fileInput('file1', 'Choose xls file',
                    accept = c(".XLS")),

          actionButton("btn", "Update Table"),
          actionButton("btn1", "Display Plot")

        ),

        mainPanel(

          tableOutput('what'),
          plotOutput('pl'))
      )

    )
    ,

    server = function(input, output, session){

      dataOP <- reactive({
        inFile <- input$file1
        if (is.null(input$file1))
          return(NULL)

        # ORIGINAL dfs <- Identify_IP(read.table(inFile$datapath))
        # using internal dataset for example
        dfs <- Identify_IP(iris)

        # ORIGINAL list(tble = dfs, plt = dfs)
        # lets just return your dfs, its already a list in code above
        return(dfs)
      })


      observeEvent(input$btn, output$what <-  renderTable({

        #print(dataOP()) # debug line that led to [[1]] idea
        # ORIGINAL  dataOP()$tble
        # just say first in list
        dataOP()[[1]]

        }))

      observeEvent(input$btn1, output$pl <- renderPlot({


        #ggplot(dataOP()$plt)
        # since already a plot just need to index it
        # I found [[2]] worked better than explicit dataOP()$plt
        pp <- dataOP()

        pp[[2]]

      }))             
    }))

<强> RESULT

table and plot example

瞧!

答案 1 :(得分:0)

1)尝试print (ggplot(dataOP()$plt))

看看this answer I wrote

2)很抱歉,如果没有ggplot代码位和数据,很难解释。鉴于@amrrs问题,您可以尝试使用print()str()临时行在您的Shiny代码中进行调试,以查看您的数据返回的内容。即。

print(dataOP()$plt)
str(dataOP())

更糟糕的情况是,尝试将您的代码分成两部分。因此,使用Identify_IP代码来执行数据处理,然后使用刚刚返回绘图的ggplot代码创建Print_IP。它可能排除你的图表不是问题。

3)看看reactiveValues()

https://shiny.rstudio.com/reference/shiny/0.11/reactiveValues.html

它&#34;烘烤&#34;结果是反应性的。图表中出现的类型可能是反应类型而非图表类型。也许分享您收到的任何错误消息。