I am currently unable to load the "kableExtra" package when using the "knit" button in RStudio. The code works fine if I execute it in the console or if I just call "rmarkdown::render" directly.
I reported this bug previously, and the topic was closed after 21 days while I was on vacation out of town. But I now have more information, and I think I can explain what the problem is.
Below is a minimal reproducible example. (Note that I replaced leading spaces with underscores, because the forum software eats the leading white space that is significant in a YAML header.)
title: "My Title"
author: "Kevin R. Coombes"
date: "r Sys.Date()
"
output:
__html_document:
____theme: readable
____highlight: kate
__pdf_document:
____highlight: kate
We need these packages from the R library:
cat("class:", class(rmarkdown::metadata$output),
"\n\tlength:", length(rmarkdown::metadata$output), "\n",
file = stderr())
library(kableExtra)
And here is the error message (including the output I wrote using cat):
class: list
length: 2
Quitting from lines 15-19 [packs] (00-kEbug.Rmd)
Error:
! package or namespace load failed for 'kableExtra':
.onLoad failed in loadNamespace() for 'kableExtra', details:
call: !is.null(rmarkdown::metadata$output) && rmarkdown::metadata$output %in%
error: 'length = 2' in coercion to 'logical(1)'
Backtrace:
- base::library(kableExtra)
- base::tryCatch(...)
- base (local) tryCatchList(expr, classes, parentenv, handlers)
- base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
- value[3L]
Execution halted
As you can see, the value of rmarkdown::metadata$output is a list of length 2, where each element is of length greater than 1, (since the YAML header specifies multiple options for two different kinds of output documents). The bug arises from the change in R 4.3 that asys you need a logical of length exactly 1 in a conditional "if" statement, and the test here is being performed on a longer list.
Note that if you run this code in the console, the value of rmarkdown::metadata$output is simply NULL, so it doesn't cause an error/