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

Quarto Live中R与WebR代码块间对象共享方法咨询

在Quarto Live中实现R与WebR环境的对象共享

问题概述

使用Quarto Live(0.1.3-dev)+Quarto 1.6.40创建混合R、WebR、OJS的交互式文档时,本地R代码块中创建的my_penguins对象无法在WebR代码块中访问,报错object 'my_penguins' not found。但WebR代码块直接调用ggplot(penguins)可以正常运行,因为penguins是WebR环境中palmerpenguins包自带的数据。尝试define、input、write/read_rds()等方法均无效,需找到R与WebR独立环境间共享对象的可靠方案。

最小复现示例:

---
title: "Quarto Live"
format: live-html
webr:
  packages:
    - dplyr
    - ggplot2
    - palmerpenguins
---

{{< include ./_extensions/r-wasm/live/_knitr.qmd >}}

```{r}
library(palmerpenguins)
my_penguins <- penguins
#| edit: false
#| output: false
#| define:
#|   - do_penguins_density
do_penguins_density <- function(measure) {
  ggplot(my_penguins) +
    aes(x = .data[[measure]], fill = species) +
    geom_density(alpha = 0.8)
}
//| echo: false
viewof measure = Inputs.select(
  [ "flipper_length_mm", "bill_length_mm", "bill_depth_mm", "body_mass_g" ],
  { label: "Measure" }
);
do_penguins_density(measure);
## 推荐解决方案

Quarto Live中本地R与浏览器端WebR是完全隔离的运行环境,无法直接共享内存对象,必须通过**显式数据序列化+传递**实现共享,以下两种是官方认可的可靠方案:

### 方法1:文件读写传递数据
将本地R中的对象写入CSV格式文件,WebR代码块中读取该文件:

修改后的完整代码:
```yaml
---
title: "Quarto Live"
format: live-html
webr:
  packages:
    - dplyr
    - ggplot2
    - palmerpenguins
---

{{< include ./_extensions/r-wasm/live/_knitr.qmd >}}

```{r}
library(palmerpenguins)
my_penguins <- penguins
# 将数据写入CSV文件,Quarto会自动处理资源路径
write.csv(my_penguins, "my_penguins.csv", row.names = FALSE)
#| edit: false
#| output: false
#| define:
#|   - do_penguins_density
# 从文件读取数据
my_penguins <- read.csv("my_penguins.csv")
do_penguins_density <- function(measure) {
  ggplot(my_penguins) +
    aes(x = .data[[measure]], fill = species) +
    geom_density(alpha = 0.8)
}
//| echo: false
viewof measure = Inputs.select(
  [ "flipper_length_mm", "bill_length_mm", "bill_depth_mm", "body_mass_g" ],
  { label: "Measure" }
);
do_penguins_density(measure);
### 方法2:嵌入JSON数据到页面
将本地R对象序列化为JSON,嵌入到HTML页面中,WebR通过JS接口读取该JSON数据:

修改后的完整代码:
```yaml
---
title: "Quarto Live"
format: live-html
webr:
  packages:
    - dplyr
    - ggplot2
    - palmerpenguins
    - jsonlite
---

{{< include ./_extensions/r-wasm/live/_knitr.qmd >}}

```{r}
library(palmerpenguins)
library(jsonlite)
my_penguins <- penguins
# 将数据转为JSON并嵌入页面的<script>标签中
cat('<script id="my_penguins_data" type="application/json">')
cat(toJSON(my_penguins, dataframe = "rows"))
cat('</script>')
#| edit: false
#| output: false
#| define:
#|   - do_penguins_density
# 通过WebR的JS接口读取页面中的JSON数据
my_penguins <- jsonlite::fromJSON(webr::eval_js('document.getElementById("my_penguins_data").textContent'))
do_penguins_density <- function(measure) {
  ggplot(my_penguins) +
    aes(x = .data[[measure]], fill = species) +
    geom_density(alpha = 0.8)
}
//| echo: false
viewof measure = Inputs.select(
  [ "flipper_length_mm", "bill_length_mm", "bill_depth_mm", "body_mass_g" ],
  { label: "Measure" }
);
do_penguins_density(measure);
## 关键说明
- 本地R与WebR是独立环境:本地R运行在本地电脑,WebR运行在浏览器的WebAssembly环境中,两者内存不共享,必须显式传递数据。
- 为什么`penguins`可以直接使用:WebR环境中单独安装了`palmerpenguins`包,调用的是WebR自身包内的数据,而非本地R环境中的对象。

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

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

最近更新时间:2026.06.14 07:17:03