---
title: "墨尔本房价分析报告"
author: "Jean"
date: "`r Sys.Date()`"
output: html_document
runtime: shiny
---

## 后台加载墨尔本房价回归分析Shiny APP
需要用shinytest包，以便设置反应式输入，以及截图和提取反应式输出。
```{r}
library(shiny)   
library(shinytest)
# Set loadTimeout to a long time
# Can not use shinytest for larger application
# Error in sd_startShiny(self, private, path, seed) : 
#  Cannot find shiny port number. Error:
# https://community.rstudio.com/t/can-not-use-shinytest-for-larger-application/6514
app <- shinytest::ShinyDriver$new("../melbourne", loadTimeout=1000000)
# get background browser window size.
app$getWindowSize()
```

### 默认算法与异常值阀值：

算法：`r app$getValue("algo")`  异常值阀值：`r app$getValue("threshold")`% 屏幕截图。

```{r, out.width = "100%", fig.width=10, fig.height=10}
app$takeScreenshot()
```


### 设置新的算法与阀值参数

设置算法
```{r}
app$setInputs(algo="LigthGBM")
app$getValue("algo")
```

设置异常值阀值
```{r}
app$setInputs(threshold=35)
app$getValue("threshold")
```


算法：`r app$getValue("algo")`  异常值阀值：`r app$getValue("threshold")`% 屏幕截图。
```{r, out.width = "100%", fig.width=10, fig.height=10}
app$takeScreenshot()
```



## 直接显示其中一个Widget
### 提取Shiny APP中返回的数据
用shinytest包的findWidget()函数找到Widget，然后用Widget的getHtml()函数得到Widget的HTML源码（包括数据），
然后把HTML源码插入到当前页面中。因为shinytest后台运行的Shiny APP运行在另一个R进程中，Widget的源码和数据不在本进程中，所以要得到Widget的HTML源码，并插入到当前的页面。反应式输入的值可以通过getValue()函数直接得到，所以需要这样提取的一般是反应式输出的值，特别是render()函数渲染输出的HTML Widget。

参阅：

https://cran.r-project.org/web/packages/shinytest/shinytest.pdf

https://rstudio.github.io/shinytest/reference/Widget.html

显示所有Widget

```{r}
app$listWidgets()
```


### 性能数据
```{r}
perf<-app$findWidget("performance")
perfHtml<-perf$getHtml()
HTML(perfHtml)
```

### 训练集拟合效果 
```{r}
trainPlot<-app$findWidget("trainPlot")
trainHtml<-trainPlot$getHtml()
HTML(trainHtml)
```

### 验证集拟合效果 
```{r}
validPlot<-app$findWidget("validPlot")
validHtml<-validPlot$getHtml()
HTML(validHtml)
```

### 异常数据
DataTable Widget只返回第一页，因为getHtml()只返回了一页。
```{r}
outliers<-app$findWidget("outliers")
outliersHtml<-outliers$getHtml()
HTML(outliersHtml)

```

可以通过shinytest包的executeScript()函数执行JavaScript找到“下页”按钮，模拟点击翻页，用程序逐页把数据抓过来。
```{r}
app$executeScript("
var nextPage = document.getElementsByClassName('next');
if (nextPage  !=null){nextPage[0].click();}"
)
```

```{r}
outliers<-app$findWidget("outliers")
outliersHtml<-outliers$getHtml()
HTML(outliersHtml)
```



