问题描述
我对Shiny相当陌生,我有一个可能很愚蠢的问题: 我建立了一个flexdashboard来显示计算结果。首先,我在代码中手动设置输入值。下一步将是使仪表板能够使用光泽收集输入值。立即更改图和表是不合理的,但是要先收集数据,评估它们,如果它们完整且适合计算,我想重新计算并显示结果。 我能够在侧栏上显示“输入”字段并启动检查功能。为了检查数据集是否完整,我定义了一个全局可访问的data.frame来收集不同的值。通过使用质数,我想检查是否可以开始计算的特定部分。这也是检查功能的一部分。但是我希望在data.frame中收集值的愿望一直被忽略……我的代码有什么问题? 这是我要执行的操作(.rmd)的简单示例:
---
title: "example"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup,include=FALSE}
library(flexdashboard)
library(shiny)
library(stringr)
source("ProcessThatValue.R")
generate_VALUEFRAME()
```
Column {data-width=250 .sidebar}
-----------------------------------------------------------------------
### I Want Those Values
```{r}
textInput(inputId = "input_Value",label = "The value goes here",value = "",placeholder = "Gimme that value")
```
Column {data-width=750}
-----------------------------------------------------------------------
### Chart B
```{r}
h3("Here is that value:")
renderText({
if(check_VALUE_ONE(input$input_Value) == TRUE)
input$input_Value
})
```
### Chart C
```{r}
h3("Is the value in the frame?:")
renderText({
if(check_COMPLETE() == TRUE)
"Success!"
})
```
和功能:
generate_VALUEFRAME <- function()
{
FRAME <<- data.frame(VALUES = c("FIRSTVALUE"),ENTRIES = c("NOTHING"),COMPLETE = c(0),IF_COMPLETE = c(2))
}
check_VALUE_ONE <- function(VALUE)
{
letters <- str_count(VALUE)
if(letters > 3)
{
FRAME[1,2] <- VALUE
FRAME[1,3] <- FRAME[1,4]
RETURN <- TRUE
}
else
RETURN <- FALSE
RETURN
}
check_COMPLETE <- function()
{
if(sum(FRAME$COMPLETE) == 2)
RETURN <- TRUE
else
RETURN <- FALSE
}
正如renderText部分所述,很明显他进入了 check_VALUE_ONE ,因为显示该值需要使用TRUE,但FRAME根本没有改变。
任何建议将不胜感激。
THX丹尼尔
解决方法
闪亮更新值的方式是它生成有向的“反应图”。如果您的反应性值之一(例如与sliderInput
关联的值)发生变化,则会沿反应性图的有向边“激发”,告诉所有到达的顶点也要更新。
由于您的数据应该是动态的,因此明智的做法是将其设为reactive()
,例如
df <- reactive({
# put your code returning a data.frame here
})
,然后使用df()
调用它(而不是将其作为全局变量)。在该reactive()
调用中,您可以使用req()
:此函数一方面可以检查是否设置了值,另一方面可以向其传递布尔表达式(例如的返回值)。您的check_COMPLETE()
。如果req()
失败,您的反应式对象将不会更新。
现在,我在您的代码中看到的一个问题是您的函数check_COMPLETE()
没有返回任何内容(确切地说,它返回了NULL
)。
我不太确定您要做什么或代码为何失败,但是也许您只需要返回RETURN
。