如何在Shiny中模块化简单的条形图?

时间:2016-10-26 08:32:43

标签: r module shiny

这是我的应用代码:

app.R

library(shiny)

source("func.R")

# create data
name <- c("Moller", "Mayer", "Bernard")
sales <- c(35000, 40000, 60000)
df <- data.frame(name, sales)

# app
server <- function(input, output, session) {
  x <- callModule(testPlot, "test", data = reactive(df), xAxis = reactive("name"), yAxis = reactive("sales"))
}
ui <- fluidPage(
  testPlotUI(id = "test", stringName = "test")
)

shinyApp(ui = ui, server = server)

这是我的模块代码:

func.R

library(shiny)
library(ggplot2)

testPlotUI <- function(id, stringName){
  ns <- NS(id)
  fluidRow(
    column(12,
      plotOutput(stringName)
    )
  )
}

testPlot <- function(data, xAxis, yAxis){
  output$test <- renderPlot({
    ggplot(data(), aes_string(x=xAxis(), y=yAxis())) + geom_bar(stat = "identity")
  })
}

此代码最终会出现此错误:

  

模块出错(childScope $ input,childScope $ output,childScope,...)   :未使用的参数(childScope $ input,childScope $ output,   childScope)

我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您收到该错误的原因是,模块服务器部分的前三个参数必须为inputoutputsession。所以你需要改变:

testPlot <- function(data, xAxis, yAxis){
  output$test <- renderPlot({
    ggplot(data(), aes_string(x=xAxis(), y=yAxis())) + geom_bar(stat = "identity")
  })
}

成:

testPlot <- function(input, output, session, data, xAxis, yAxis){
  output$test <- renderPlot({
    ggplot(data(), aes_string(x=xAxis(), y=yAxis())) + geom_bar(stat = "identity")
  })
}

仅凭此更改,您的代码现在可以正常运行而不会出现任何错误。但是,什么都不会出现。那是因为你忘记了使用模块的另一个关键组件,即将所有输入/输出id包装在ns()函数中。所以改变:

column(12,
       plotOutput(stringName)
)

成:

column(12,
       plotOutput(ns(stringName))
)

现在你应该看到你的情节没有问题了。