REditorSupport / vscode-R

R Extension for Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=REditorSupport.r
MIT License
1.07k stars 128 forks source link

Cannot render .rmd missing pandoc #969

Open timo-berg opened 2 years ago

timo-berg commented 2 years ago

Describe the bug I'm trying to render a simple .Rmd file in VSCode but it keeps telling me Error: pandoc version 1.12.3 or higher is required and was not found (see the help page ?rmarkdown::pandoc_available).

To Reproduce For testing purposes I tried to render a markdown with only one cell

1+1

with the same result. When I try to render the same Markdown in RStudio it works without problems. Pandoc is installed under /usr/local/bin/pandoc and executing pandoc -v shows the correct version. When I open a radian shell in VSCode and type rmarkdown::pandoc_version() it also shows the correct version. The command that VSCode executes it rmarkdown::render('[path to file]/Chap04.Rmd', encoding = 'UTF-8')

Expected behavior VSCode should render the markdown just as RStudio does.

Environment (please complete the following information):

Additional context I tried the various other solutions to this problem such as setting the RSTUDIO_PANDOC variable but without any luck.

eitsupi commented 2 years ago

The command that VSCode executes it rmarkdown::render('[path to file]/Chap04.Rmd', encoding = 'UTF-8')

What happens if you run the same command from the R console?

shrektan commented 2 years ago

One simple solution is to copy the pandoc binary bundled in RStudio to /usr/local/bin.

In short:

  1. Open RStudio IDE
  2. Execute file.copy(rmarkdown::pandoc_exec(), "/usr/local/bin/pandoc", overwrite = TRUE)
timo-berg commented 2 years ago

The command that VSCode executes it rmarkdown::render('[path to file]/Chap04.Rmd', encoding = 'UTF-8')

What happens if you run the same command from the R console?

This works! I also found out that if I run a code chunk and then try to execute rmarkdown::pandoc_version(), it doesn't find pandoc (i.e. it outputs "0"). Somehow the code chunk execution opens a different kind of R terminal that doesn't find pandoc? I use radian installed via homebrew. image

shrektan commented 2 years ago

Have you read my comment above?

Does coping the pandoc binary work?

I'll explain a little bit:

RStudio IDE will bundle a pandoc binary with itself. So, RStudio can find the pandoc execuable while r or radian can't. Just copy that binary to where r and radian can find will fix your issue, in my opinion.

timo-berg commented 2 years ago

Sorry yes, I tried that but it didn't change anything. The binary was also already present in the bin folder.

gowerc commented 2 years ago

I'm wondering if this is a .bash_profile vs .bashrc issue ? As in I'm wondering if @timo-berg has defined their pandoc PATH as part of the .bash_profile but that its not going loaded in vscode-r's call to R / rmarkdown?

Doing some googling it looks like rmarkdown looks for the value of RSTUDIO_PANDOC to find pandoc if its not on your PATH. A simple solution in theory then would be to add

RSTUDIO_PANDOC=/path/to/pandoc

in a .Renviron file in the root your project (or in the global Renviron file if you have root access).

(source: https://stackoverflow.com/questions/28432607/pandoc-version-1-12-3-or-higher-is-required-and-was-not-found-r-shiny/29710643#29710643)

timo-berg commented 2 years ago

Thanks that solved the issue! If anybody else has this issue: Set Settings > R > Rmarkdown > Knit: Command to Sys.setenv(RSTUDIO_PANDOC="--path to pandoc"); rmarkdown::render I'm still a bit confused because I was able to knit my rmarkdowns without issues before and am not sure what caused it to crash but it is resolved. Thanks to all!

marcel-goldschen-ohm commented 2 years ago

I am not super familiar with R or .Rmd files, but after installing r-essentials and r-rmarkdown via conda, then in VS Code settings editing the R path to point to the conda installation, whenever I try to knit a .Rmd file I get the error Error: pandoc version 1.12.3 or higher is required and was not found (see the help page ?rmarkdown::pandoc_available). Unfortunately, changing the Knit: Command to: Sys.setenv(RSTUDIO_PANDOC="my/path/to/pandoc"); rmarkdown::render where my/path/to/pandoc is the path to pandoc in my conda environment as suggested by @timo-berg did not solve the issue for me. I also tried installing the language server, radian and httpgd as recommended in https://code.visualstudio.com/docs/languages/r, but this also did not solve this problem. I'm running VS Code 1.71.0 with the R Extension installed and R 4.1.3 installed via conda on MacOS 12.5.1. Any suggestions for anything else I could try to get .Rmd files working in VS Code?

marcel-goldschen-ohm commented 2 years ago

Just to add to the above, pandoc is found by R:

> rmarkdown::pandoc_available()
[1] TRUE

> rmarkdown::find_pandoc()
$version
[1] ‘2.19.2’
marcel-goldschen-ohm commented 2 years ago

Ok, few more pieces of info specific to VS Code:

dereckmezquita commented 2 years ago

Commenting to lend a hand to others who might encounter a similar issue with this in the future.

TLDR

Custom Rmd yaml commands overwrite all other; to get knitting working in VSCode with a custom command and the RStudio version of pandoc modify your command as such:

---
output: github_document
knit: (function(inputFile, encoding) {
        Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/quarto/bin');
        rmarkdown::render(inputFile,
                        encoding=encoding, 
                        output_file=file.path(dirname(inputFile), "README.md")) })
---

Explanation

I am using VSCode for my R work and wanted to knit a document. First I ran into the issue mentioned here that pandoc cannot be found so I installed pandoc via conda. This worked perfectly and I could now click the knit button in VSCode and knit my document.

I later noticed there were differences in the products from RStudio knits to VSCode knits. For example footnotes were not rendering.

I would write in Rmd:

Some text here and then a footnote^[Some text]

The result in RStudio knit would be:

Some text here and then a footnote[^1]

[^1]: [Some text]

However in VSCode result would be:

Some text here and then a footnote[1]

[1] [Some text]

There were other differences as well this is why I investigated. I noticed my knit commands being executed were:

# studio
/Applications/RStudio.app/Contents/MacOS/quarto/bin/pandoc +RTS -K512m -RTS 03-06-terraform-and-docker.knit.md --to gfm-yaml_metadata_block --from markdown+autolink_bare_uris+tex_math_single_backslash --output ./03-06-terraform-and-docker.md --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/default.md '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 
/Applications/RStudio.app/Contents/MacOS/quarto/bin/pandoc +RTS -K512m -RTS ./03-06-terraform-and-docker.md --to html4 --from gfm --output ./03-06-terraform-and-docker.html --standalone --self-contained --highlight-style pygments --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/preview.html --variable 'github-markdown-css:/opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/github.css' --metadata pagetitle=PREVIEW '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 

# vscode
/Users/neurox1/Tools/miniconda3/bin/pandoc +RTS -K512m -RTS 03-06-terraform-and-docker.knit.md --to gfm --from markdown+autolink_bare_uris+tex_math_single_backslash --output ./03-06-terraform-and-docker.md --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/default.md '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 
/Users/neurox1/Tools/miniconda3/bin/pandoc +RTS -K512m -RTS ./03-06-terraform-and-docker.md --to html4 --from gfm --output ./03-06-terraform-and-docker.html --standalone --self-contained --highlight-style pygments --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/preview.html --variable 'github-markdown-css:/opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/github.css' --metadata pagetitle=PREVIEW '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;'

These were indeed using different pandoc versions/executables.

I uninstalled conda pandoc and tried running again; but failure as VSCode knit cannot find pandoc.

Nothing worked, even setting env variables etc and even setting the knit command as stated in this thread in the VSCode settings.

I noticed that the command being executed was actually the custom command I set in my Rmd yaml; which overwrites any other and modified it to this:

---
output: github_document
knit: (function(inputFile, encoding) {
        Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/quarto/bin');
        rmarkdown::render(inputFile,
                        encoding=encoding, 
                        output_file=file.path(dirname(inputFile), "README.md")) })
---
ElianHugh commented 2 years ago

Thank you for digging into this @dereckdemezquita! will have to check what's going on with the pandoc path setting -- it should be picked up by node (but obviously something weird is going on)

tiubenedict commented 2 years ago

Just adding that the path for my pandoc was in /Applications/RStudio.app/Contents/MacOS/quarto/bin/tools

JoeHelbing commented 1 year ago

Commenting to lend a hand to others who might encounter a similar issue with this in the future.

TLDR

Custom Rmd yaml commands overwrite all other; to get knitting working in VSCode with a custom command and the RStudio version of pandoc modify your command as such:

---
output: github_document
knit: (function(inputFile, encoding) {
        Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/quarto/bin');
        rmarkdown::render(inputFile,
                        encoding=encoding, 
                        output_file=file.path(dirname(inputFile), "README.md")) })
---

Explanation

I am using VSCode for my R work and wanted to knit a document. First I ran into the issue mentioned here that pandoc cannot be found so I installed pandoc via conda. This worked perfectly and I could now click the knit button in VSCode and knit my document.

I later noticed there were differences in the products from RStudio knits to VSCode knits. For example footnotes were not rendering.

I would write in Rmd:

Some text here and then a footnote^[Some text]

The result in RStudio knit would be:

Some text here and then a footnote[^1]

[^1]: [Some text]

However in VSCode result would be:

Some text here and then a footnote[1]

[1] [Some text]

There were other differences as well this is why I investigated. I noticed my knit commands being executed were:

# studio
/Applications/RStudio.app/Contents/MacOS/quarto/bin/pandoc +RTS -K512m -RTS 03-06-terraform-and-docker.knit.md --to gfm-yaml_metadata_block --from markdown+autolink_bare_uris+tex_math_single_backslash --output ./03-06-terraform-and-docker.md --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/default.md '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 
/Applications/RStudio.app/Contents/MacOS/quarto/bin/pandoc +RTS -K512m -RTS ./03-06-terraform-and-docker.md --to html4 --from gfm --output ./03-06-terraform-and-docker.html --standalone --self-contained --highlight-style pygments --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/preview.html --variable 'github-markdown-css:/opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/github.css' --metadata pagetitle=PREVIEW '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 

# vscode
/Users/neurox1/Tools/miniconda3/bin/pandoc +RTS -K512m -RTS 03-06-terraform-and-docker.knit.md --to gfm --from markdown+autolink_bare_uris+tex_math_single_backslash --output ./03-06-terraform-and-docker.md --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/default.md '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;' 
/Users/neurox1/Tools/miniconda3/bin/pandoc +RTS -K512m -RTS ./03-06-terraform-and-docker.md --to html4 --from gfm --output ./03-06-terraform-and-docker.html --standalone --self-contained --highlight-style pygments --template /opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/preview.html --variable 'github-markdown-css:/opt/homebrew/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/github.css' --metadata pagetitle=PREVIEW '--webtex=https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;'

These were indeed using different pandoc versions/executables.

I uninstalled conda pandoc and tried running again; but failure as VSCode knit cannot find pandoc.

Nothing worked, even setting env variables etc and even setting the knit command as stated in this thread in the VSCode settings.

I noticed that the command being executed was actually the custom command I set in my Rmd yaml; which overwrites any other and modified it to this:

---
output: github_document
knit: (function(inputFile, encoding) {
        Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/quarto/bin');
        rmarkdown::render(inputFile,
                        encoding=encoding, 
                        output_file=file.path(dirname(inputFile), "README.md")) })
---

Adding this to the R > Rmarkdown > Knit: Command extension settings in VScode worked for me, but it outputs everything in the README.md format.

Is there a way to vary it dynamically to output as PDF or HTML by Rmd output: type?

dereckmezquita commented 1 year ago

@JoeHelbing not sure what you meant but this might help: https://pkgs.rstudio.com/rmarkdown/reference/render.html

The output type gets read by the yaml above the call to rmarkdown::render.

tongyaop commented 1 year ago

Unfortunately, none of these have worked for me. I tried:

  1. in rmd yaml section, added knit: (function(inputFile, encoding) { Sys.setenv(RSTUDIO_PANDOC="C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools"); rmarkdown::render(inputFile, encoding=encoding, output_file=file.path(dirname(inputFile), "README.md")) })

  2. In vscode > settings> R> Rmarkdown > knit::Command Sys.setenv(RSTUDIO_PANDOC="C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools"); rmarkdown::render

  3. In terminal (Windows command prompt): set RSTUDIO_PANDOC "C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools"

I restarted vscode session every time I made these changes.

pokwir commented 1 year ago

Installing Pandoc using homebrew solved my problem. brew install pandoc

snail123815 commented 11 months ago

I am running R using vscode in a conda environment of a remote server.

I notice that the PATH in the vscode interactive R terminal does not include the necessary environment path. I came up with this solution. Here is my settings.json file.

{
    "r.rpath.linux": "/path/to/myenv/bin/R",
    "r.rterm.linux": "/path/to/myenv/bin/R",
    "r.rmarkdown.knit.command": "Sys.setenv(PATH=paste(\"/path/to/myenv/bin\", Sys.getenv(\"PATH\"), sep=\":\")); rmarkdown::render",
}