diff --git a/R/knitr-engine.R b/R/knitr-engine.R index 3e9951fa9..0f1dfe20e 100644 --- a/R/knitr-engine.R +++ b/R/knitr-engine.R @@ -676,8 +676,25 @@ eng_python_autoprint <- function(captured, options) { } else if (inherits(value, "pandas.core.frame.DataFrame")) { - return(captured) + # this comes from https://github.com/yihui/knitr/blob/7bc8b393e261c88f299bccc7eee40b4e952ebd57/R/output.R#L197 + isQuarto <- !is.null(knitr::opts_knit$get('quarto.version')) + renderDF <- getOption("reticulate.engine.render_df", default = TRUE) + + # Quarto documents running Python with the Jupyter engine return richly rendered + # data.frames and we want keep the same behavior for documents rendered with + # the knitr engine + if (isQuarto && renderDF) { + return(eng_python_generic_autoprint(captured, value)) + } + # we respect the Rmarkdown `df_print` option that allows to control how + # to display data.frames in the document. In the case it's not the default, + # we cast into an R data.frame and let knitr handle the rendering. + if (knitr::opts_knit$get("rmarkdown.df_print") != "default" && renderDF) { + return(knitr::knit_print(py_to_r(value), options = options)) + } + + return(captured) } else if (isHtml && py_has_method(value, "_repr_html_")) { py_capture_output({ @@ -730,7 +747,13 @@ eng_python_autoprint <- function(captured, options) { return("") - } else if (py_has_method(value, "_repr_markdown_")) { + } else { + return(eng_python_generic_autoprint(captured, value)) + } +} + +eng_python_generic_autoprint <- function(captured, value) { + if (py_has_method(value, "_repr_markdown_")) { data <- as_r_value(value$`_repr_markdown_`()) .engine_context$pending_plots$push(knitr::asis_output(data)) @@ -748,5 +771,4 @@ eng_python_autoprint <- function(captured, options) { return(captured) } - } diff --git a/tests/testthat/_snaps/python-knitr-engine/default.html b/tests/testthat/_snaps/python-knitr-engine/default.html new file mode 100644 index 000000000..31a6c26bc --- /dev/null +++ b/tests/testthat/_snaps/python-knitr-engine/default.html @@ -0,0 +1,439 @@ + + + + + + + + + + + + + +Python Multiple Print & Comments + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
r.mtcars
+
##                       mpg  cyl   disp     hp  drat  ...   qsec   vs   am  gear  carb
+## Mazda RX4            21.0  6.0  160.0  110.0  3.90  ...  16.46  0.0  1.0   4.0   4.0
+## Mazda RX4 Wag        21.0  6.0  160.0  110.0  3.90  ...  17.02  0.0  1.0   4.0   4.0
+## Datsun 710           22.8  4.0  108.0   93.0  3.85  ...  18.61  1.0  1.0   4.0   1.0
+## Hornet 4 Drive       21.4  6.0  258.0  110.0  3.08  ...  19.44  1.0  0.0   3.0   1.0
+## Hornet Sportabout    18.7  8.0  360.0  175.0  3.15  ...  17.02  0.0  0.0   3.0   2.0
+## Valiant              18.1  6.0  225.0  105.0  2.76  ...  20.22  1.0  0.0   3.0   1.0
+## Duster 360           14.3  8.0  360.0  245.0  3.21  ...  15.84  0.0  0.0   3.0   4.0
+## Merc 240D            24.4  4.0  146.7   62.0  3.69  ...  20.00  1.0  0.0   4.0   2.0
+## Merc 230             22.8  4.0  140.8   95.0  3.92  ...  22.90  1.0  0.0   4.0   2.0
+## Merc 280             19.2  6.0  167.6  123.0  3.92  ...  18.30  1.0  0.0   4.0   4.0
+## Merc 280C            17.8  6.0  167.6  123.0  3.92  ...  18.90  1.0  0.0   4.0   4.0
+## Merc 450SE           16.4  8.0  275.8  180.0  3.07  ...  17.40  0.0  0.0   3.0   3.0
+## Merc 450SL           17.3  8.0  275.8  180.0  3.07  ...  17.60  0.0  0.0   3.0   3.0
+## Merc 450SLC          15.2  8.0  275.8  180.0  3.07  ...  18.00  0.0  0.0   3.0   3.0
+## Cadillac Fleetwood   10.4  8.0  472.0  205.0  2.93  ...  17.98  0.0  0.0   3.0   4.0
+## Lincoln Continental  10.4  8.0  460.0  215.0  3.00  ...  17.82  0.0  0.0   3.0   4.0
+## Chrysler Imperial    14.7  8.0  440.0  230.0  3.23  ...  17.42  0.0  0.0   3.0   4.0
+## Fiat 128             32.4  4.0   78.7   66.0  4.08  ...  19.47  1.0  1.0   4.0   1.0
+## Honda Civic          30.4  4.0   75.7   52.0  4.93  ...  18.52  1.0  1.0   4.0   2.0
+## Toyota Corolla       33.9  4.0   71.1   65.0  4.22  ...  19.90  1.0  1.0   4.0   1.0
+## Toyota Corona        21.5  4.0  120.1   97.0  3.70  ...  20.01  1.0  0.0   3.0   1.0
+## Dodge Challenger     15.5  8.0  318.0  150.0  2.76  ...  16.87  0.0  0.0   3.0   2.0
+## AMC Javelin          15.2  8.0  304.0  150.0  3.15  ...  17.30  0.0  0.0   3.0   2.0
+## Camaro Z28           13.3  8.0  350.0  245.0  3.73  ...  15.41  0.0  0.0   3.0   4.0
+## Pontiac Firebird     19.2  8.0  400.0  175.0  3.08  ...  17.05  0.0  0.0   3.0   2.0
+## Fiat X1-9            27.3  4.0   79.0   66.0  4.08  ...  18.90  1.0  1.0   4.0   1.0
+## Porsche 914-2        26.0  4.0  120.3   91.0  4.43  ...  16.70  0.0  1.0   5.0   2.0
+## Lotus Europa         30.4  4.0   95.1  113.0  3.77  ...  16.90  1.0  1.0   5.0   2.0
+## Ford Pantera L       15.8  8.0  351.0  264.0  4.22  ...  14.50  0.0  1.0   5.0   4.0
+## Ferrari Dino         19.7  6.0  145.0  175.0  3.62  ...  15.50  0.0  1.0   5.0   6.0
+## Maserati Bora        15.0  8.0  301.0  335.0  3.54  ...  14.60  0.0  1.0   5.0   8.0
+## Volvo 142E           21.4  4.0  121.0  109.0  4.11  ...  18.60  1.0  1.0   4.0   2.0
+## 
+## [32 rows x 11 columns]
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/tests/testthat/_snaps/python-knitr-engine/kable.html b/tests/testthat/_snaps/python-knitr-engine/kable.html new file mode 100644 index 000000000..ba903ff9b --- /dev/null +++ b/tests/testthat/_snaps/python-knitr-engine/kable.html @@ -0,0 +1,888 @@ + + + + + + + + + + + + + +Python Multiple Print & Comments + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
r.mtcars
+
+ ++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX421.06160.01103.902.62016.460144
Mazda RX4 Wag21.06160.01103.902.87517.020144
Datsun 71022.84108.0933.852.32018.611141
Hornet 4 Drive21.46258.01103.083.21519.441031
Hornet Sportabout18.78360.01753.153.44017.020032
Valiant18.16225.01052.763.46020.221031
Duster 36014.38360.02453.213.57015.840034
Merc 240D24.44146.7623.693.19020.001042
Merc 23022.84140.8953.923.15022.901042
Merc 28019.26167.61233.923.44018.301044
Merc 280C17.86167.61233.923.44018.901044
Merc 450SE16.48275.81803.074.07017.400033
Merc 450SL17.38275.81803.073.73017.600033
Merc 450SLC15.28275.81803.073.78018.000033
Cadillac Fleetwood10.48472.02052.935.25017.980034
Lincoln Continental10.48460.02153.005.42417.820034
Chrysler Imperial14.78440.02303.235.34517.420034
Fiat 12832.4478.7664.082.20019.471141
Honda Civic30.4475.7524.931.61518.521142
Toyota Corolla33.9471.1654.221.83519.901141
Toyota Corona21.54120.1973.702.46520.011031
Dodge Challenger15.58318.01502.763.52016.870032
AMC Javelin15.28304.01503.153.43517.300032
Camaro Z2813.38350.02453.733.84015.410034
Pontiac Firebird19.28400.01753.083.84517.050032
Fiat X1-927.3479.0664.081.93518.901141
Porsche 914-226.04120.3914.432.14016.700152
Lotus Europa30.4495.11133.771.51316.901152
Ford Pantera L15.88351.02644.223.17014.500154
Ferrari Dino19.76145.01753.622.77015.500156
Maserati Bora15.08301.03353.543.57014.600158
Volvo 142E21.44121.01094.112.78018.601142
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/tests/testthat/_snaps/python-knitr-engine/paged.html b/tests/testthat/_snaps/python-knitr-engine/paged.html new file mode 100644 index 000000000..9bcc61063 --- /dev/null +++ b/tests/testthat/_snaps/python-knitr-engine/paged.html @@ -0,0 +1,1680 @@ + + + + + + + + + + + + + +Python Multiple Print & Comments + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
r.mtcars
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/tests/testthat/resources/pandas-autoprint.Rmd b/tests/testthat/resources/pandas-autoprint.Rmd new file mode 100644 index 000000000..ce82554c7 --- /dev/null +++ b/tests/testthat/resources/pandas-autoprint.Rmd @@ -0,0 +1,8 @@ +--- +title: "Python Multiple Print & Comments" +--- + +```{python} +r.mtcars +``` + diff --git a/tests/testthat/test-python-knitr-engine.R b/tests/testthat/test-python-knitr-engine.R index fbc028fe5..02a9b0cc8 100644 --- a/tests/testthat/test-python-knitr-engine.R +++ b/tests/testthat/test-python-knitr-engine.R @@ -99,3 +99,25 @@ test_that("Output streams are remaped when kniting", { expect_snapshot_file(test_path("resources", "knitr-print2.md")) }) + +test_that("correctly handles `df_print` for pandas data frames", { + + skip_on_cran() + skip_if_not_installed("rmarkdown") + local_edition(3) + + owd <- setwd(test_path("resources")) + on.exit({setwd(owd)}, add = TRUE) + for (df_print in c("paged", "default", "kable")) { + out_file <- paste0(df_print, ".html") + rmarkdown::render( + "pandas-autoprint.Rmd", + quiet = TRUE, + output_file = out_file, + output_format = rmarkdown::html_document( + df_print = df_print + )) + expect_snapshot_file(out_file) + } + +})