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
相关产品推荐
相关产品推荐

