rmarkdown icon indicating copy to clipboard operation
rmarkdown copied to clipboard

`shiny_prerendered` parses `DESCRIPTION` file from wrong location

Open nanxstats opened this issue 1 year ago • 5 comments
trafficstars

Under specific conditions, rmarkdown/learnr incorrectly searches for and attempts to parse a DESCRIPTION file outside the intended project directory. This issue arises if the DESCRIPTION file contains errors such as formatting issues, causing the quiz component to remain in a "loading" state. This state persists without providing an error message to identify the issue for developers or users.

In Posit Workbench, this problem becomes a HTTP 500 error in the Chrome DevTools Network tab, with a possible DCF parsing error message in the response.

Minimal reproducible example

usethis::create_project("example")

In the new project window, run

usethis::use_description()
writeLines(append(readLines("DESCRIPTION"), "", after = 1), "DESCRIPTION")
fs::file_move("DESCRIPTION", "~/DESCRIPTION")
rmarkdown::draft("example.Rmd", template = "tutorial", package = "learnr", create_dir = FALSE, edit = FALSE)

Open example.Rmd, run the document, and navigate to "Topic 2". The quiz will display "Loading..." instead of the content.

Session info

> xfun::session_info('rmarkdown')
R version 4.3.2 (2023-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.2.1, RStudio 2023.12.1.402

Locale: en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8

Package version:
  base64enc_0.1.3   bslib_0.6.1       cachem_1.0.8     
  cli_3.6.2         digest_0.6.34     ellipsis_0.3.2   
  evaluate_0.23     fastmap_1.1.1     fontawesome_0.5.2
  fs_1.6.3          glue_1.7.0        graphics_4.3.2   
  grDevices_4.3.2   highr_0.10        htmltools_0.5.7  
  jquerylib_0.1.4   jsonlite_1.8.8    knitr_1.45       
  lifecycle_1.0.4   magrittr_2.0.3    memoise_2.0.1    
  methods_4.3.2     mime_0.12         R6_2.5.1         
  rappdirs_0.3.3    rlang_1.1.3       rmarkdown_2.25   
  sass_0.4.8        stats_4.3.2       stringi_1.8.3    
  stringr_1.5.1     tinytex_0.49      tools_4.3.2      
  utils_4.3.2       vctrs_0.6.5       xfun_0.41        
  yaml_2.3.8       

Pandoc version: 3.1.11.1

Checklist

When filing a bug report, please check the boxes below to confirm that you have provided us with the information we need. Have you:

  • [x] formatted your issue so it is easier for us to read?

  • [x] included a minimal, self-contained, and reproducible example?

  • [x] pasted the output from xfun::session_info('rmarkdown') in your issue?

  • [x] upgraded all your packages to their latest versions (including your versions of R, the RStudio IDE, and relevant R packages)?

  • [x] installed and tested your bug with the development version of the rmarkdown package using remotes::install_github("rstudio/rmarkdown")?

nanxstats avatar Feb 02 '24 16:02 nanxstats

Thanks for the report @nanxstats! This seems specific to learnr, or have you seen this behavior with other rmarkdown formats? If not, I'll move this over to the learnr bug tracker.

gadenbuie avatar Feb 02 '24 17:02 gadenbuie

@gadenbuie Sure thing. I think this issue is more prevalent for learnr projects because it's probably a major source of usage of the shiny_prerendered runtime, although the fix could come from different places.

nanxstats avatar Feb 02 '24 17:02 nanxstats

@nanxstats Can you try this with another shiny prerendered document that isn't a learnr tutorial? Does it also create problematic behavior under similar circumstances (where an unrelated DESCRIPTION file exists in a parent directory)?

gadenbuie avatar Feb 02 '24 17:02 gadenbuie

@gadenbuie Good idea. I further tried the two examples in Prerendered Shiny Documents with html_document and flex_dashboard outputs - the Shiny components in both of them work ok even with the unrelated DESCRIPTION file in the parent directory. This might suggest the issue is more learnr-specific.

Also, here is a slightly updated minimal reproducible example - it gives a better hint on where the error happened (a read.dcf() call somewhere):

usethis::create_project("example")
# In the new project
usethis::use_description()
writeLines(append(readLines("DESCRIPTION"), "Imports", after = 1), "DESCRIPTION")
fs::file_move("DESCRIPTION", "~/DESCRIPTION")
rmarkdown::draft("example.Rmd", template = "tutorial", package = "learnr", create_dir = FALSE, edit = FALSE)

Run document:

Loading required package: shiny

Listening on http://127.0.0.1:3852
Warning: Error in read.dcf: Invalid DCF format.
Regular lines must have a tag.
Offending lines start with:
  Imports
  3: <Anonymous>
  1: rmarkdown::run

nanxstats avatar Feb 03 '24 04:02 nanxstats

@gadenbuie do you want to move this issue then as it seems learnr related ?

Though we do read dcf in this code base when handling dependencies https://github.com/rstudio/rmarkdown/blob/07e2a9902915eef52ab0b085ca344f1a371dcdf0/R/shiny_prerendered.R#L330-L353

We do try to find project root but related to a dependency file. Is there also a read dcf call in learnr ? Or would this be this one ?

cderv avatar Feb 05 '24 21:02 cderv