You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Quarto的Shiny Server中调用提前创建的dataframe遇错求助

在Quarto Shiny Server中使用提前创建的数据框的问题解决

问题描述

在Quarto文档中基于内置数据集iris创建了数据框df2,尝试在Shiny Server代码块和UI侧边栏中使用该数据框时,出现“找不到对象df2”的错误。即使尝试在Server块内基于全局环境的df创建df2,同样无法运行。

问题原因

Quarto中Shiny的不同代码块运行在相互隔离的环境中:

  • 无特殊属性的普通R代码块:运行在文档渲染的全局环境
  • 带context: server的代码块:运行在Shiny的服务器函数专属环境
  • 带panel属性的UI代码块:运行在Shiny的UI构造环境

不同环境之间无法直接访问彼此的变量,所以全局环境创建的df2无法被Server或UI环境识别。

解决方法

方法1:将数据创建移至Server代码块内

直接在Server环境中创建需要使用的数据,确保变量在Server环境内可访问:

```{r}
#| context: server
library(dplyr)
library(ggplot2)

# 在Server环境内创建数据
df <- iris
df2 <- df

selectedData <- reactive({
  subset(df2, Species %in% input$specie)
})

output$plot1 <- renderPlot({
  selectedData() %>%
    ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()
})
### 方法2:使用`context: global`创建共享全局数据
通过`context: global`属性标记代码块,这里创建的变量会被UI和Server环境共享:
```r
```{r}
#| context: global
# 创建全局共享的数据框
df <- iris
df2 <- df
之后UI侧边栏和Server代码块就可以直接使用`df2`:
```r
# UI侧边栏块
```{r}
#| panel: sidebar
vars <- unique(df2$Species)
selectInput('specie', 'Specie: ', vars)
Server块
#| context: server
library(dplyr)
library(ggplot2)

selectedData <- reactive({
  subset(df2, Species %in% input$specie)
})

output$plot1 <- renderPlot({
  selectedData() %>%
    ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()
})
## 补充说明
之前尝试在Server块内用`df2 <- df`失败,是因为`df`属于全局环境变量,Server环境无法直接访问。只要把数据创建放在`context: global`块,或者直接在Server块内创建所有需要的数据,就能解决变量访问问题。

内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:37