【问题标题】:Collecting values from Input从输入中收集值
【发布时间】:2020-08-13 13:49:23
【问题描述】:

我对 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 丹尼尔

【问题讨论】:

    标签: r shiny global-variables flexdashboard


    【解决方案1】:

    闪亮更新值的方式是它生成一个有向的“反应图”。如果您的反应值之一(例如与sliderInput 关联的值)发生变化,它会沿着反应图的有向边“触发”,同时通知所有到达的顶点也进行更新。

    由于您的数据应该是动态的,因此将其设为 reactive() 可能是明智之举,例如

    df <- reactive({
      # put your code returning a data.frame here
    })
    

    然后使用df() 调用它(而不是将其作为全局变量)。在reactive() 调用中,您可以使用req():此函数一方面可以检查是否设置了值,另一方面,您可以将布尔表达式传递给它(例如您的check_COMPLETE() 的返回值. 如果req() 失败,你的反应对象将不会被更新。

    现在,我在您的代码中看到的一个问题是您的函数check_COMPLETE() 没有返回任何内容(准确地说,它返回NULL)。 我不太确定您要做什么或代码失败的原因,但也许您只需要返回RETURN

    【讨论】:

    • 嗨尼克拉斯,谢谢!现在我可以使用响应函数收集数据框中的输入数据。使用 renderTable 函数可以查看输入值是否已充分定义。现在我正在努力重新计算我的模型......我无法将新数据发送到我的计算函数。我必须将其定义为闪亮的服务器吗? (仅仅是我,还是 Shiny 中的 i/o 处理比 C++ 复杂得多?)
    • reactive() 实际上返回一个函数。您是否确保使用df() 而不仅仅是df 来调用您的数据?你需要习惯闪亮,但一旦你习惯了,我觉得它很不错。
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多