gpt4 book ai didi

r-markdown - 如何在Quarto Markdown(qmd)中实现类似于R Markdown的 block 可重用性的代码可重用性?

转载 作者:行者123 更新时间:2023-12-03 07:54:55 27 4
gpt4 key购买 nike

我正在尝试渲染四开 Markdown (qmd),并且在我的 qmd 文件中,我的目标是多次重用代码块。具体来说,我希望执行带有标签 label: package-import 的代码单元,而不在初始调用中显示其代码(即 echo: false),但随后重用代码单元以在后续代码单元中显示命令(即 echo: true)。这个概念的灵感来自于 R Markdown 中 block 可重用性的实现,如 14.1 Reuse code chunks | R Markdown Cookbook 中所述。 。然而,重用代码单元的方法在14.1.2 Use the same chunk label in another chunk中描述。和 14.1.3 Use reference labels (*)使用 qmd 时不可用。 qmd 中是否有等效的功能,可以实现类似于 R Markdown 中的代码可重用性?

MWE-same-chunk-label.qmd

复制14.1.2 Use the same chunk label in another chunk使用四开本

```{python}
# | echo: false
# | eval: true
# | label: packcage-import

import os
import session_info
```

```{python}
import session_info

session_info.show()
```

```{python}
# | echo: true
# | eval: false
# | label: packcage-import
```

ERROR: Cell label names must be unique (found duplicate '#packcage-import')

MWE-use-in-another-chunk.qmd

复制14.1.3 Use reference labels (*)使用四开本

```{python}
# | echo: false
# | eval: true
# | label: packcage-import

import os
import session_info
```

```{python}
import session_info

session_info.show()
```

```{python}
# | ref.label="packcage-import"
```

Starting python3 kernel...Done

Executing 'experiment.ipynb'

Cell 1/3...Done

Cell 2/3...Done

Cell 3/3...ERROR:

None of the known patterns match for ref.label="packcage-import"

最佳答案

正如我在评论中提到的,您可以使用 Lua 过滤器在 Quarto 中更接近地模仿 R-markdown 中的代码重用模式。所以我提出以下解决方案(尽管我认为这不是一个好的解决方案)。

---
title: Code Reuse in Quarto
format: html
jupyter: python3
filters:
- code-reuse.lua
---

```{python}
#| classes: hide-all
#| label: package-import

import os
```

```{.python ref-label="package-import"}
```

```{.python ref-label="package-import"}
```

```{python}
#| label: testing
#| classes: hide-code

def greetings():
print("Hello from python")

greetings()
```

```{.python ref-label="testing"}
```

有几点需要注意

  • 要重用之前编写的 block ,请使用不可执行的代码块语法(即 {.python})以及 ref-label 属性(注意使用等号=,而不是:)。 ref-label 的值将是您要使用的 block 标签。

  • 最重要的是,要重用 block ,必须对其进行 echo 编辑。如果使用echo: false,lua过滤器无法获取该 block 的内容。但为了获得与 echo: false 相同的行为,我使用了两个类,hide-all 将隐藏 block 中的所有代码以及输出和 hide-code 将仅隐藏 block 代码,而不隐藏输出。

  • 还要注意,显然你不能执行重用的 block ,因为 lua 过滤器的所有这些代码复制都是在 jupyter 笔记本或任何引擎完成执行之后发生的。所以只有原始 block 被执行。因此使用 eval: trueeval: false 是不必要的!

代码重用.lua

str = pandoc.utils.stringify

local function get_code(code)
return {
CodeBlock = function(cb)
if cb.classes:includes('cell-code') then
code["content"] = cb.text
end
return cb
end
}
end


local function collect_cb_labels(collection)
return {
Div = function(el)
local code = {}
el:walk(get_code(code))
content_table = {
["label"] = el.identifier,
["code_content"] = code["content"]
}
table.insert(collection, content_table)
end
}
end


local function reuse_code(collection)
return {
CodeBlock = function(cb)
local ref = cb.attributes["ref-label"]
if ref then
for key, val in ipairs(collection) do
if (str(val.label) == str(ref)) then
cb.text = val.code_content
return cb
end
end
end
end
}
end


local function hide_code()
return {
CodeBlock = function(cb)
if cb.classes:includes('cell-code') then
return pandoc.Null()
end
end
}
end


local function check_visibility()
return {
Div = function(el)
if el.classes:includes('hide-all') then
return pandoc.Null()
elseif el.classes:includes('hide-code') then
return el:walk(hide_code())
end
end
}
end


function Pandoc(doc)
local collection = {}
doc:walk(collect_cb_labels(collection))
local doc = doc:walk(reuse_code(collection))
return doc:walk(check_visibility())
end

enter image description here

关于r-markdown - 如何在Quarto Markdown(qmd)中实现类似于R Markdown的 block 可重用性的代码可重用性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76278117/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com