Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support results = 'hide' directly in python engine #1599

Open
cderv opened this issue Apr 23, 2024 · 2 comments · May be fixed by #1600
Open

Support results = 'hide' directly in python engine #1599

cderv opened this issue Apr 23, 2024 · 2 comments · May be fixed by #1600

Comments

@cderv
Copy link
Contributor

cderv commented Apr 23, 2024

Reported in

and full example at

Problem

Currently, results = 'hide' does not seem to be handled by reticulate's knitr engine. Example:

---
title: "Test report"
output: html_document
---

```{r, results = 'hide'}
class MyClass:
    def _repr_html_(self):
        return "<p>uh-oh</p>"

MyClass()
```

The results will still be shown. This is a minimal example - see posit-dev/great-tables#291 for one with great_tables

Context

This is because _repr_html_ is catched to be returned as a knitr::raw_html()

reticulate/R/knitr-engine.R

Lines 744 to 750 in d4e752b

} else if (isHtml && py_has_method(value, "_repr_html_")) {
py_capture_output({
data <- as_r_value(value$`_repr_html_`())
})
.engine_context$pending_plots$push(knitr::raw_html(data))
return("")

and provided in the out component on which knitr:::sew() will apply

reticulate/R/knitr-engine.R

Lines 626 to 628 in d4e752b

eng_python_wrap <- function(outputs, options) {
knitr::engine_output(options, out = outputs)
}

By returning engine_output(out = ), knitr's assumes the output is already filtered with what should be filtered.
Otherwise, it will be handled directly engine_output() default usage
https://github.com/yihui/knitr/blob/ba8d9fb0ecd60f3f9ebec58fdde1e689bdc40ad3/R/engine.R#L96-L98

So I do think reticulate needs to support results = 'hide' and not provide outputs in the list when the option is provided.

I can make a PR - just need to think about the best place to do this.

@t-kalinowski
Copy link
Member

Thanks, I agree reticulate should support results = 'hide' option.

What is the relation or difference between include = FALSE and results = 'hide'?
I believe that reticulate already has support for a include = FALSE chunk option.

@cderv
Copy link
Contributor Author

cderv commented Apr 24, 2024

include = FALSE means that chunks are ran, but nothing (nor source or results) is added to the output. This is directly handled by knitr for all engine as it will only show the processed output of an engine when include = TRUE.

results = "hide" means to hide the results in the outputs. echo = FALSE and results = "hide" together are almost equivalent to include = FALSE, except with includes, all the hooks will still apply (especially the output hooks). While for results is does not necessarily. But usually the hooks may not do any difference.

Anyhow, I don't think reticulate needs to handle include, but it needs to handle results. I'll send a PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants