flexdashboard 中不同页面的不同侧边栏具有不同的输入小部件

Different sidebars with different input widgets for different pages in flexdashboard

下面是我尝试使用 flexdashboard 制作的一个应用程序,它由多个页面组成。(现在正在制作第二个页面,称为 CH2)

---
title: "Financial TS Analysis"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
    smooth_scroll: true
    
    theme: simplex
---


```{r setup, include=FALSE}
library(flexdashboard)
library(fBasics)
library(FinTS)
library(tidyquant)
library(shiny)
library(quantmod)
library(ggplot2)
library(highcharter)
library(shinyjs)
library(htmltools)
scroll_css = "<style> #section-text {overflow-y: scroll;}</style>"
```

Sidebar {.sidebar}
=========================================
```{r echo=FALSE}
tags$h5("Please click the submit button after every input change")
tags$hr()

textInput("tickers","Ticker",value = "",placeholder = "tickers")
dateInput("from","Starting Date",format = "yyyy-mm-dd")
sliderInput("k","Number of Period",min = 0,max = 250,value = 10)
checkboxGroupInput("priceKind","Kind (Choose 1)",c("Open","High","Low","Close"),selected = "Close",inline = TRUE)
# Close = Adjusted
kind = c("Open","High","Low","Close")
kindIndex = c(1,2,3,4)
names(kindIndex) = kind

numericInput("x","Initial Investment in $",value = 0)
sliderInput("m","Number of Periods of Interest Payment per annum",min = 1,max = 365,value = 2)
sliderInput("r","Interest year per annum",min = 0,max = 1,value = 0.05)

actionButton("go","Submit")
```

CH 1
=========================================

Row {data-height=300}
-----------------------------------------

```{css my-style, echo=FALSE}
#section-notes-and-formulas
  .chart-stage-flex {
    overflow-y: scroll;
  }
```


### Notes and Formulas
```{r}
htmltools::includeMarkdown('Notes.Rmd')
```
 


Row {.tabset .tabset-fade}
---------------------------------------------

### Price 
```{r}
## Data retrieval based on starting date and tickers
data = eventReactive(input$go,{
  data = getSymbols(Symbols = input$tickers,src = "yahoo",from = input$from,to = Sys.Date(),auto.assign = FALSE)
  data =data[,kindIndex[input$priceKind]]
  data
})

## Showing data
renderHighchart({
  data = data()
  highchart(type="stock") %>% hc_title(text = paste("price of ",input$tickers,sep = "")) %>% 
    hc_add_series(data,name="Price",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```


### Return (1)
```{r}
get_One_Period_Simple_Return = function(price){
  n = length(price)
  Return = (price[2:n]/price[1:(n-1)])
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,get_One_Period_Simple_Return))
  highchart(type="stock") %>% hc_title(text = paste("One-Period Simple Return of ",input$tickers,sep = "")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```

### Return (2)
```{r}
get_One_Period_Simple_Net_Return = function(price){
  n = length(price)
  Return = (price[2:n]/price[1:(n-1)]) - 1
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,get_One_Period_Simple_Net_Return))
  highchart(type="stock") %>% hc_title(text = paste("One-Period Simple Net Return of ",input$tickers,sep="")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```

### Return (3)
```{r}
get_multi_Period_Simple_Return = function(price,k){
  n = length(price)
  Return = (price[k:n]/price[1:(n-k)])
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,get_multi_Period_Simple_Return,input$k))
  highchart(type="stock") %>% hc_title(text = paste("Multiperiod Simple Gross Return of ",input$tickers,sep="")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```


### Return (4)
```{r}
get_multi_Period_Simple_Return = function(price,k){
  n = length(price)
  Return = (price[k:n]-price[1:(n-k)])/price[1:(n-k)]
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,get_multi_Period_Simple_Return,input$k))
  highchart(type="stock") %>% hc_title(text = paste("k-period Simple Net Return of ",input$tickers,sep="")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```


### Return (5)
```{r}
get_multi_Period_Simple_Return = function(price,k){
  n = length(price)
  Return = ((price[k:n]/price[1:(n-k)]))^(1/k) -1
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,get_multi_Period_Simple_Return,input$k))
  highchart(type="stock") %>% hc_title(text = paste("Annualized Return of ",input$tickers,sep="")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```


### Compounding Effect (6)
```{r}
compounder = function(C,m,r) {
  values = c()
  for (i in 1:m) {
    val = C*(1+r/i)^i
    values = c(values,val)
    
  }
  t = 1:m
  names(values) = t
  return(values)
}

renderPlot({
  data = compounder(input$x,input$m,input$r)
    plot(1:input$m,data,xlab = "period",ylab = "value",main=paste("growth of ",input$x,"$ principal when r = ",input$r," and number of compounding period is ",input$m,sep=""))
    
})
```

### Return (7)
```{r}
log_return = function(price){
  n = length(price)
  Return = log(price[2:n]/price[1:(n-1)])
  return(Return)
}

renderHighchart({
  data = data()
  data = as.xts(apply(data,2,log_return))
  highchart(type="stock") %>% hc_title(text = paste("Log Return of ",input$tickers,sep = "")) %>% 
    hc_add_series(data,name="Return",color="blue") %>% 
    hc_navigator(enabled=TRUE) %>% 
    hc_scrollbar(enabled=TRUE) %>% 
    hc_exporting(enabled=TRUE) %>% 
    hc_chart(zoomType = "xy")
})
```

### Basic Statistics of Return in \%
```{r}
returns = eventReactive(input$go,{
  data = data()
  returns = apply(data,2,get_One_Period_Simple_Net_Return)*100
  returns
})

renderTable({basicStats(returns())},rownames = TRUE,border = TRUE,striped = TRUE,hover = TRUE)
```

### t-test (log returns)
```{r}
logR = eventReactive(input$go,{
  data = data()
  returns = apply(data,2,log_return)*100
  returns
})

renderPrint({t.test(logR())})
```

### Normality Test (JB)
```{r}
renderPrint({normalTest(logR(),method='jb')})
```

CH2
============================================

我想知道的是如何为我的第二页 (CH2) 提供一个带有不同输入小部件的侧边栏。如您所见,我的第一页 (CH1) 有一个侧边栏,但第二页需要一个不同的侧边栏。

您可以在每个页面上使用输入 {.sidebar}。参见 https://rmarkdown.rstudio.com/flexdashboard/layouts.html#input_sidebar

---
title: "Sidebar"
output: flexdashboard::flex_dashboard
runtime: shiny
---


Page 1
===================================== 

Inputs {.sidebar}
-------------------------------------

```{r}
# shiny inputs for first page defined here
```
 
Column
-------------------------------------
    
### Chart 1
    
```{r}
```
    
### Chart 2

```{r}
```

Page 2
===================================== 

Inputs {.sidebar}
-------------------------------------

```{r}
# shiny inputs for second page defined here
```
 
Column
-------------------------------------
    
### Chart 1
    
```{r}
```
    
### Chart 2

```{r}
```