R语言包翻译

Shiny-cheatsheet

作者:周彦通

 

1.安装

install.packages("shinydashboard")

 2.基础知识

 

仪表盘有三个部分:标题、侧边栏,身体。下面是最最小的仪表面板页面的UI:

 

# ui.R #library(shinydashboard)

 

dashboardPage(

  dashboardHeader(),

  dashboardSidebar(),

  dashboardBody())

 

通过shinyApp()函数可以快速查看R控制台:

 

# app.R #

library(shiny)

library(shinydashboard)

 

ui <- dashboardPage(

  dashboardHeader(),

  dashboardSidebar(),

  dashboardBody())

server <- function(input, output) { }

 

shinyApp(ui, server)

 

 

 添加实用部分:

 

## app.R ##

library(shiny)

library(shinydashboard)

 

ui <- dashboardPage(

  dashboardHeader(title = "Basic dashboard"),

  dashboardSidebar(),

  dashboardBody(

    # Boxes need to be put in a row (or column)

    fluidRow(

      box(plotOutput("plot1", height = 250)),

      

      box(

        title = "Controls",

        sliderInput("slider", "Number of observations:", 1, 100, 50)

      )

    )

  )

)

 

server <- function(input, output) {

  set.seed(122)

  histdata <- rnorm(500)

  

  output$plot1 <- renderPlot({

    data <- histdata[seq_len(input$slider)]

    hist(data)

  })

}

 

shinyApp(ui, server)

 

 

添加侧边栏:

下面将添加性能像tabs的菜单项,这与shiny中的tabPanels相似,当点击菜单栏的时候,将在main body中显示设置的不同的内容。为了实现这种功能,需要做到两点,第一,在侧边栏dashboardSidebar 的sidebarMenu中添加menuItem,并用tabName设置其名称,如下所示:

 

## Sidebar content

  dashboardSidebar(

    sidebarMenu(

      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),

      menuItem("Widgets", tabName = "widgets", icon = icon("th"))

    )

  )

 

第二,在dashboardBody中添加tabItem和tabItems,并设置tabName:

 

## Body content

  dashboardBody(

    tabItems(

      # First tab content第一个标签内容

      tabItem(tabName = "dashboard",

        fluidRow(

          box(plotOutput("plot1", height = 250)),

 

          box(

            title = "Controls",

            sliderInput("slider", "Number of observations:", 1, 100, 50)

          )

        )

      ),

 

      # Second tab content第二个标签内容

      tabItem(tabName = "widgets",

        h2("Widgets tab content")

      )

    )

  )

 

默认显示为“Dashboard”菜单:

 

当点击“Widgets”时:

 

3.结构---Shiny and HTML

 To understand how the parts of a dashboard work together, we first need to know how a Shiny UI is built, and how it relates to the HTML of a web page.在Shiny中的HTML标签函数,比如div()和p()返回的对象可以呈现为HTML。例如,当您在R控制台运行这些命令,它将打印HTML:

 

# A basic div

div(class = "my-class", "Div content")

## <div class="my-class">Div content</div>

 

# Nested HTML tags

div(class = "my-class", p("Paragraph text"))

## <div class="my-class">

##   <p>Paragraph text</p>

## </div>

 

 

 

一些函数返回更复杂的HTML片段,他们使用户不必知道所有的所需的HTML来龙去脉创建诸如文本输入或者侧边栏:

 

textInput("Id", "Label")

## <div class="form-group shiny-input-container">

##   <label for="Id">Label</label>

##   <input id="Id" type="text" class="form-control" value=""/>

## </div>

 

sidebarPanel(

  div("First div"),

  div("Second div")

)

## <div class="col-sm-4">

##   <form class="well">

##     <div>First div</div>

##     <div>Second div</div>

##   </form>

## </div>

 

Shiny app的UI构建这些HTML。shinydashboard包提供了一组函数用来创建HTML,将生成一个仪表板。如果你复制一个仪表板页面的UI代码(上图)粘贴到R控制台,它将打印仪表板的HTML代码。

 

3.1结构概述

 仪表盘dashboardPage()函数三个组件:头,侧边栏,身体:

dashboardPage(

  dashboardHeader(),

  dashboardSidebar(),

  dashboardBody()

)

对于更复杂的APP,APP划分成块可以让它更可读:

 

header <- dashboardHeader()

 

sidebar <- dashboardSidebar()

 

body <- dashboardBody()

 

dashboardPage(header, sidebar, body)

 

下面分别介绍上面的三个部分

3.2Header

标题可以有一个标题和下拉菜单,例子:

 

设置该标题比较简单,仅需要使用title参数:

dashboardHeader(title = "My Dashboard")

dropdownMenu()函数生成下拉菜单。有三种类型的菜单——消息message、通知notification和任务tasks,每个菜单必须用相应类型的项填充。

3.2.1消息message菜单

 

dropdownMenu()函数中添加messageItem()函数,messageItem()中包含消息菜单需要的值(from和message,form指的是消息来源,message指的是消息内容)。您还可以控制图标和通知时间字符串。默认情况下,图标是一个人的轮廓。(关于如何设置icon图标,在后面的外观中会有详细的介绍)字符串可以是任何文本。例如,它可能是一个相对的日期/时间像“5分钟”,“今天”,或“昨天中午12:30”,或者一个绝对时间,像“2014-12-01 13:45”。

 

dropdownMenu(type = "messages",

  messageItem(

    from = "Sales Dept",

    message = "Sales are steady this month."

  ),

  messageItem(

    from = "New User",

    message = "How do I register?",

    icon = icon("question"),

    time = "13:45"

  ),

  messageItem(

    from = "Support",

    message = "The new server is ready.",

    icon = icon("life-ring"),

    time = "2014-12-01"

  )

)

 

 

显示动态内容

在大多数情况下,你会想要动态的内容。这意味着在服务器端生成HTML内容,发送到客户端表现。在UI代码,可以使用dropdownMenuOutput是这样的:

dashboardHeader(dropdownMenuOutput("messageMenu"))

在服务器端,您在renderMenu中会生成整个菜单,如下:

 

output$messageMenu <- renderMenu({

  # 此处生成每一个messageItems到list. This assumes

  # 假设messageData是一个带有两列的数据框(data frame),两列显示的内容分别是'from' and 'message'.

  msgs <- apply(messageData, 1, function(row) {

    messageItem(from = row[["from"]], message = row[["message"]])

  })

 

  # 这相当于调用:

  # dropdownMenu(type="messages", msgs[[1]], msgs[[2]], ...)

  dropdownMenu(type = "messages", .list = msgs)

})

 

对于交互式的例子,使用帮助?renderMenu.

动态显示sliderbarMenu:

 

library(shiny)

library(shinydashboard)

ui <- dashboardPage(

  dashboardHeader(title = "Dynamic sidebar"),

  dashboardSidebar(

    sidebarMenuOutput("menu")

  ),

  dashboardBody()

)

 

server <- function(input, output) {

  output$menu <- renderMenu({

    sidebarMenu(

      menuItem("Menu item", icon = icon("calendar"))

    )

  })

}

 

shinyApp(ui, server)

 

 

动态显示dropdownMenu:

 

library(shiny)

library(shinydashboard)

# ========== Dynamic dropdownMenu ==========

# Example message data in a data frame

messageData <- data.frame(

  from = c("Admininstrator", "New User", "Support"),

  message = c(

    "Sales are steady this month.",

    "How do I register?",

    "The new server is ready."

  ),

  stringsAsFactors = FALSE

)

 

ui <- dashboardPage(

  dashboardHeader(

    title = "Dynamic menus",

    dropdownMenuOutput("messageMenu")

  ),

  dashboardSidebar(),

  dashboardBody(

    fluidRow(

      box(

        title = "Controls",

        sliderInput("slider", "Number of observations:", 1, 100, 50)

      )

    )

  )

)

 

server <- function(input, output) {

  output$messageMenu <- renderMenu({

    msgs <- apply(messageData, 1, function(row) {

      messageItem(

        from = row[["from"]],

        message = paste(row[["message"]], input$slider)

      )

    })

    

    dropdownMenu(type = "messages", .list = msgs)

  })

}

 

shinyApp(ui, server)

 

 

 

 

下面是一个Shiny定制版本的动态UI,更多关于使用动态UI,看到这个例子:

UI.R

 

library(shiny)

shinyUI(fluidPage(

  titlePanel("Dynamically generated user interface components"),

  fluidRow(

 

    column(3, wellPanel(

      selectInput("input_type", "Input type",

        c("slider", "text", "numeric", "checkbox",

          "checkboxGroup", "radioButtons", "selectInput",

          "selectInput (multi)", "date", "daterange"

        )

      )

    )),

 

    column(3, wellPanel(

      # This outputs the dynamic UI component

      uiOutput("ui")

    )),

 

    column(3,

      tags$p("Input type:"),

      verbatimTextOutput("input_type_text"),

      tags$p("Dynamic input value:"),

      verbatimTextOutput("dynamic_value")

    )

  )

))

 

server.R

 

library(shiny)

shinyServer(function(input, output) {

 

  output$ui <- renderUI({

    if (is.null(input$input_type))

      return()

 

    # Depending on input$input_type, we'll generate a different    # UI component and send it to the client.

    switch(input$input_type,

      "slider" = sliderInput("dynamic", "Dynamic",

                             min = 1, max = 20, value = 10),

      "text" = textInput("dynamic", "Dynamic",

                         value = "starting value"),

      "numeric" =  numericInput("dynamic", "Dynamic",

                                value = 12),

      "checkbox" = checkboxInput("dynamic", "Dynamic",

                                 value = TRUE),

      "checkboxGroup" = checkboxGroupInput("dynamic", "Dynamic",

        choices = c("Option 1" = "option1",

                    "Option 2" = "option2"),

        selected = "option2"

      ),

      "radioButtons" = radioButtons("dynamic", "Dynamic",

        choices = c("Option 1" = "option1",

                    "Option 2" = "option2"),

        selected = "option2"

      ),

      "selectInput" = selectInput("dynamic", "Dynamic",

        choices = c("Option 1" = "option1",

                    "Option 2" = "option2"),

        selected = "option2"

      ),

      "selectInput (multi)" = selectInput("dynamic", "Dynamic",

        choices = c("Option 1" = "option1",

                    "Option 2" = "option2"),

        selected = c("option1", "option2"),

        multiple = TRUE

      ),

      "date" = dateInput("dynamic", "Dynamic"),

      "daterange" = dateRangeInput("dynamic", "Dynamic")

    )

  })

 

  output$input_type_text <- renderText({

    input$input_type

  })

 

  output$dynamic_value <- renderPrint({

    str(input$dynamic)

  })

 

})

 

显示如下:

 

 

 

3.2.2通知notification

 

dropdownMenu()函数中添加notificationItem()来包含一个文本通知。您还可以控制图标和状态的颜色。关于如何控制在后面会详细介绍。

 

dropdownMenu(type = "notifications",

  notificationItem(

    text = "5 new users today",

    icon("users")

  ),

  notificationItem(

    text = "12 items delivered",

    icon("truck"),

    status = "success"

  ),

  notificationItem(

    text = "Server load at 86%",

    icon = icon("exclamation-triangle"),

    status = "warning"

  )

)

 

动态交互:

 

library(shiny)

library(shinydashboard)

# ========== Dynamic dropdownMenu ==========

# Example message data in a data frame

messageData <- data.frame(

  text = c("5 new users today", "12 items delivered", "Server load at 86%"),

  status = c(

    "success",

    "warning",

    "warning"

  ),

  stringsAsFactors = FALSE

)

 

 

ui <- dashboardPage(

  dashboardHeader(

    title = "Dynamic menus",

    dropdownMenuOutput("notificationsMenu")

  ),

  dashboardSidebar(),

  dashboardBody(

    fluidRow(

      box(

        title = "Controls",

        sliderInput("slider", "Number of observations:", 1, 100, 50)

      )

    )

  )

)

 

 

server <- function(input, output) {

  output$notificationsMenu <- renderMenu({

    msgs <- apply(messageData, 1, function(row) {

      notificationItem(

        text = row[["text"]],

        status = row[["status"]]

      )

    })

    

    dropdownMenu(type = "notifications", .list = msgs)

  })

}

 

shinyApp(ui, server)

 

 

3.2.3任务tasks菜单

任务项有一个进度条和一个文本标签。您还可以指定进度条的颜色,你可以使用? validColors列出可以有效的颜色。

red   yellow   aqua    blue   light-blue    green   navy   teal    olive   lime   orange    fuchsia   purple  maroon  black

代码如下:

 

dropdownMenu(type = "tasks", badgeStatus = "success",

  taskItem(value = 90, color = "green",

    "Documentation"

  ),

  taskItem(value = 17, color = "aqua",

    "Project X"

  ),

  taskItem(value = 75, color = "yellow",

    "Server deployment"

  ),

  taskItem(value = 80, color = "red",

    "Overall project"

  )

)

 

3.2.4禁用标题头

如果你不想显示标题栏,您可以禁用它:

dashboardHeader(disable = TRUE)

 3.3Sidebar

侧边栏通常用于快速导航,它包含像tabPanel标签的菜单项,、以及shiny的输入,如滑块和文本输入等,如下图所示:

 

3.3.1侧边栏菜单项和选项卡

侧边栏中的链接可以像shiny中的tabPanels使用。也就是说,当你点击一个链接,它将在仪表板的主体中显示不同的内容。下面是一个tabPanel的简单例子:

 

当用户单击其中一个菜单项,它转换显示在主体中的内容:

 

这些菜单项都放在sidebarMenu()方法中,如下所示。利用tabItem匹配一个menuItem,确保他们有可以匹配的tabName值。

 

## ui.R ##

sidebar <- dashboardSidebar(

  sidebarMenu(

    menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),

    menuItem("Widgets", icon = icon("th"), tabName = "widgets",

             badgeLabel = "new", badgeColor = "green")

  )

)

 

body <- dashboardBody(

  tabItems(

    tabItem(tabName = "dashboard",

      h2("Dashboard tab content")

    ),

 

    tabItem(tabName = "widgets",

      h2("Widgets tab content")

    )

  )

)

 

# Put them together into a dashboardPage

dashboardPage(

  dashboardHeader(title = "Simple tabs"),

  sidebar,

  body

)

 

menuItem有一个图标icon选项, 由shiny的icon ()函数创建。(更多信息在后面会详细介绍。)badgeLabel和badgeColor为选项标记,分别是表示名和标记显示颜色。一个menuItem除了控制标签可以做其他的事情;它还可以包含一个外部链接的内容,如果你为href提供一个值。默认情况下,这些外部链接打开一个新的浏览器标签或窗口;这可以通过newtab选项达到效果。

menuItem("Source code", icon = icon("file-code-o"),

           href = "https://github.com/rstudio/shinydashboard/")

下面为示例:

 

library(shiny)

library(shinydashboard)

# ========== Dynamic dropdownMenu ==========

# Example message data in a data frame

messageData <- data.frame(

  text = c("5 new users today", "12 items delivered", "Server load at 86%"),

  status = c(

    "success",

    "warning",

    "warning"

  ),

  stringsAsFactors = FALSE

)

 

 

sidebar <- dashboardSidebar(

  sidebarMenu(

    menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),

    menuItem("Widgets", icon = icon("th"), tabName = "widgets",

             badgeLabel = "new", badgeColor = "green"),

    menuItem("百度搜索", icon = icon("file-code-o"),

             href = "http://www.baidu.com")

  )

)

 

body <- dashboardBody(

  tabItems(

    tabItem(tabName = "dashboard",

            h2("Dashboard tab content")

    ),

    

    tabItem(tabName = "widgets",

            h2("Widgets tab content")

    )

  )

)

 

ui <- dashboardPage(

  dashboardHeader(

    title = "Dynamic menus",

    dropdownMenuOutput("notificationsMenu")

  ),

  sidebar,

  body

)

 

 

server <- function(input, output) {

  output$notificationsMenu <- renderMenu({

    msgs <- apply(messageData, 1, function(row) {

      notificationItem(

        text = row[["text"]],

        status = row[["status"]]

      )

    })

    

    dropdownMenu(type = "notifications", .list = msgs)

  })

}

 

shinyApp(ui, server)

 

 

3.3.2动态内容

侧边栏菜单可以动态生成,renderMenusidebarMenuOutput。下面是一个示例应用程序与一个侧边栏,是在服务器端生成的。

 

ui <- dashboardPage(

  dashboardHeader(title = "Dynamic sidebar"),

  dashboardSidebar(

    sidebarMenuOutput("menu")

  ),

  dashboardBody()

)

 

server <- function(input, output) {

  output$menu <- renderMenu({

    sidebarMenu(

      menuItem("Menu item", icon = icon("calendar"))

    )

  })

}

 

shinyApp(ui, server)

 

也可以动态生成个人物品:

 

ui <- dashboardPage(

  dashboardHeader(title = "Dynamic sidebar"),

  dashboardSidebar(

    sidebarMenu(

      menuItemOutput("menuitem")

    )

  ),

  dashboardBody()

)

 

server <- function(input, output) {

  output$menuitem <- renderMenu({

    menuItem("Menu item", icon = icon("calendar"))

  })

}

 

shinyApp(ui, server)

 

3.3.3侧边栏加入输入项

 侧边栏也可以包含普通的输入,sliderInputtextInput

 

shinydashboard还包括一个特殊类型的输入,sidebarSearchForm,如上面的截图所示,有一个搜索项。这本质上是一个特殊格式化的文本输入和actionButton动作按钮,它显示为一个放大镜图标(图标可以通过icon改变)。

sidebarSearchForm(textId = "searchText", buttonId = "searchButton",

                    label = "Search...")

对于这个搜索表单,相应的值在服务器端代码输入,分别是inputsearchTextinputsearchText和input searchButton。

 

library(shiny)

library(shinydashboard)

 

ui<-dashboardPage(

  dashboardHeader(title = "Sidrbar inputs"),

  dashboardSidebar(

    sidebarSearchForm(textId = "searchText", buttonId = "searchButton",

                      label = "Search..."),

    sliderInput("slider", "Slider:", 1, 100, 50),

    textInput("text", "Text input:")

  ),

  dashboardBody(

    h2("鸢尾花数据集作图")

  )

)

 

server <- function(input, output){}

 

shinyApp(ui,server)

 

 

3.3.4隐藏侧边栏

dashboardSidebar(disable = TRUE)

3.4Body

仪表板页面的主体可以包含任何常规的shiny内容。然而,如果你创建一个仪表板你可能会想要更加结构化的东西。大部分仪表板的基本构建块是box。box反过来可以包含任何内容。

Boxes

boxes是主要的仪表板页面的构建块。box()函数可以创建一个基本的框,box的内容可以(大多数)是任何shiny的UI内容。

在一个典型的仪表板中,这些boxes将被放置在一个fluidRow()函数体中(稍后我们会看到更多关于仪表板布局介绍):

 

# This is just the body component of a dashboard

dashboardBody(

  fluidRow(

    box(plotOutput("plot1")),

    

    box(

      "Box content here", br(), "More box content",

      sliderInput("slider", "Slider input:", 1, 100, 50),

      textInput("text", "Text input:")

    )

  )

)

 

完整程序如下:

 

library(shiny)

library(shinydashboard)

 

ui<-dashboardPage(

  dashboardHeader(title = "Sidrbar inputs"),

  dashboardSidebar(

    sidebarSearchForm(textId = "searchText", buttonId = "searchButton",

                      label = "Search..."),

    sliderInput("slider", "Slider:", 1, 100, 50),

    textInput("text", "Text input:")

  ),

  dashboardBody(

    fluidRow(

      box(plotOutput("plot1")),

      

      box(

        "Box content here",br(),"More box content",

        sliderInput("slider","Slider input:",1,100,50),

        textInput("text","Text input:")

      )

    )

  )

)

 

server <- function(input, output){

  set.seed(122)

  histdata <- rnorm(500)

  

  output$plot1<-renderPlot({

    hist(histdata)

  })

  

}

 

shinyApp(ui,server)

 

 

boxes可以使用title和status设置标题和标题条颜色

 

box(title = "Histogram", status = "primary", plotOutput("plot1", height = 250)),

 

box(

  title = "Inputs", status = "warning",

  "Box content here", br(), "More box content",

  sliderInput("slider", "Slider input:", 1, 100, 50),

  textInput("text", "Text input:")

)

 

 

可以通过solidHeader = TRUE设置固体头(长度一定的solid header),并通过collapsible=TRU在右上角显示一个最小化按钮(或者称折叠按钮)

 

box(

  title = "Histogram", status = "primary", solidHeader = TRUE,

  collapsible = TRUE,

  plotOutput("plot1", height = 250)

),

 

box(

  title = "Inputs", status = "warning", solidHeader = TRUE,

  "Box content here", br(), "More box content",

  sliderInput("slider", "Slider input:", 1, 100, 50),

  textInput("text", "Text input:")

)

 

 

 

如果你想要boxes在顶部没有灰色或彩色栏,使用solidHeader = TRUE,但不设置status参数,即可将上部分的灰色条或者彩色条去掉:

 

box(

  title = "Histogram", solidHeader = TRUE,

  collapsible = TRUE,

  plotOutput("plot1", height = 250)

),

 

box(

  title = "Inputs", solidHeader = TRUE,

  "Box content here", br(), "More box content",

  sliderInput("slider", "Slider input:", 1, 100, 50),

  textInput("text", "Text input:")

)

 

 

最后,还可以使用background选项设置固定的背景:

 

box(

  title = "Histogram", background = "maroon", solidHeader = TRUE,

  plotOutput("plot1", height = 250)

),

 

box(

  title = "Inputs", background = "black",

  "Box content here", br(), "More box content",

  sliderInput("slider", "Slider input:", 1, 100, 50),

  textInput("text", "Text input:")

)

转载于:https://www.cnblogs.com/GMGHZ971322/p/6921329.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值