Внезапный крах kableExtra в [R] - PullRequest
2 голосов
/ 21 апреля 2020

Я, вероятно, должен отметить, что я все еще довольно новичок в работе с RMarkdown и пакетом kableExtra R, но у меня есть документ, который был вязаным на прошлой неделе и теперь больше не вяжет, несмотря на отсутствие физических изменений в документе , Я получаю следующее сообщение об ошибке:

Ошибка в save_kable_latex (x, file, latex_header_include, keep_tex): мы сталкиваемся с ошибкой при попытке использовать магию для чтения сгенерированного файла PDF. Вы можете проверить свою установку magick и попробовать использовать magick :: image_read для чтения PDF-файла вручную. Также возможно, что у вас не установлен ghostscript. Звонки ... -> as_image -> save_kable -> save_kable_latex Выполнение остановлено

Я перепробовал все, что мог придумать, переустановив пакет magick R, установив ghostscript (через Homebrew) , et c.

И фрагмент кода, приведенный ниже, кажется, где возникают проблемы, где tab2 - это фрейм данных, некоторые из его элементов являются выражениями LaTeX, такими как "\\sum_x f(x)*\\left ( pe(x) - lcl(x) \\right )".

kable( tab2, format="latex", escape=FALSE, align="c", col.names=NULL ) %>%
  kable_styling( latex_options=c('hold_position') ) %>%
  footnote( general="Given x successes out of n trials, the holistic Jeffreys $100*(1-\\\\alpha)\\\\%$ Lower $\\\\textit{Credible}$ Limit is the value $p$ such that $\\\\int_0^p \\\\frac{t^{x+0.5-1}(1-t)^{n-x+0.5-1}}{B(x+0.5,n-x+0.5)} dt = \\\\alpha$ where B(a,b) is the Beta function given by $\\\\int_0^1 t^{(x-1)}(1-t)^{(y-1)} dt$.",
           general_title="", threeparttable = TRUE,
            footnote_as_chunk=TRUE, escape=FALSE ) %>%
  as_image( file="tab2.png", width=8, units="in" )

и распечатан в PDF позже с использованием функции include_graphics() на новом слайде.

Любая помощь будет принята с благодарностью, так как это для презентации работы.

РЕДАКТИРОВАТЬ # 1

В соответствии с запросом приведен минимальный рабочий пример

prob.success <- sample( seq(.5,.99,.01), size=1 )
conf.alpha <- sample( seq(.5,.99,.01), size=1 )

tab1 <- data.frame( x=0:5, f=round(dbinom(0:5,5,prob.success),3) ) %>%
  mutate( pe=x/5, lcl=qbeta(1-conf.alpha,x+0.5,5-0:5+0.5) ) %>%
  mutate( lcl=pmin(pe,lcl) ) %>%
  mutate( delta=pe-lcl ) %>%
  mutate( f_delta=f*delta )

exp.expr <- "\\sum_x f(x)*\\left ( pe(x) - lcl(x) \\right )"
exp.delta <- format( round(sum( tab1$f_delta ),4), nsmall=4 )

tab2 <- tab1 %>%
  mutate( x=as.character(x), f=format(round(f,4),nsmall=4) ) %>%
  mutate( pe=format(round(pe,4),nsmall=4) ) %>%
  mutate( lcl=format(round(lcl,4),nsmall=4) ) %>%
  mutate( delta=format(round(delta,4),nsmall=3) ) %>%
  mutate( f_delta=format(round(f_delta,4),nsmall=4) ) %>%
  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="",f_delta="") ) %>%
  rbind( ., data.frame(x="", f="", pe="Exp", lcl="Diff", delta="=", f_delta=exp.expr) ) %>%
  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="=",f_delta=exp.delta) ) %>%
  rbind( data.frame(x="x",f="f(x)",pe="pe(x)",lcl="lcl(x)",delta="pe(x)-lcl(x)",
                    f_delta="f(x)\\times\\left(pe(x)-lcl(x)\\right)"), . )

РЕДАКТИРОВАНИЕ # 2

И это пакеты R, используемые в файле .Rmd

library( knitr )
library( tibble )
library( magrittr )
library( dplyr )
library( kableExtra )
library( stringr )
library( magick )

Ответы [ 2 ]

1 голос
/ 01 мая 2020

После нескольких писем с автором kableExtra Хао Чжу было предложено использовать таблицу HTML (вместо LaTeX). В результате следующий код смог успешно отрендериться. Огромное спасибо Хао.

Изменения в оригинальном сообщении включают

exp.expr <- "$\\sum_x f(x)*\\left ( pe(x) - lcl(x) \\right )$"
tab2 <- tab1 %>%
  mutate( x=as.character(x), f=format(round(f,4),nsmall=4) ) %>%
  mutate( pe=format(round(pe,4),nsmall=4) ) %>%
  mutate( lcl=format(round(lcl,4),nsmall=4) ) %>%
  mutate( delta=format(round(delta,4),nsmall=3) ) %>%
  mutate( f_delta=format(round(f_delta,4),nsmall=4) ) %>%
#  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="",f_delta="") ) %>%
  rbind( ., data.frame(x="", f="", pe="Exp", lcl="Diff", delta="=", f_delta=exp.expr) ) %>%
  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="=",f_delta=exp.delta) ) # %>%
#  rbind( data.frame(x="x",f="f(x)",pe="pe(x)",lcl="lcl(x)",delta="pe(x)-lcl(x)",
#                    f_delta="f(x)\\times\\left(pe(x)-lcl(x)\\right)"), . )
tab.cols <- c( "x", "f(x)", "pe(x)", "lcl(x)", "pe(x)-lcl(x)",
                "$f(x)\\times\\left(pe(x)-lcl(x)\\right)$" )
kable( tab2, format="html", escape=FALSE, align="c", col.names=tab.cols ) %>%
  kable_styling( "striped", full_width = F, position="center" ) %>%
  footnote( general="Given x successes out of n trials, the holistic Jeffreys $100*(1-\\alpha)\\%$ Lower *Credible* Limit is the value $p$ such that $\\int_0^p \\frac{t^{x+0.5-1}(1-t)^{n-x+0.5-1}}{B(x+0.5,n-x+0.5)} dt = \\alpha$ where B(a,b) is the Beta function given by $\\int_0^1 t^{(x-1)}(1-t)^{(y-1)} dt$.",
           general_title="Note:", footnote_as_chunk=TRUE, escape=FALSE )
0 голосов
/ 26 апреля 2020

Кажется, вы пропустили $ отметки в вашей таблице.

prob.success <- sample( seq(.5,.99,.01), size=1 )
conf.alpha <- sample( seq(.5,.99,.01), size=1 )

tab1 <- data.frame( x=0:5, f=round(dbinom(0:5,5,prob.success),3) ) %>%
  mutate( pe=x/5, lcl=qbeta(1-conf.alpha,x+0.5,5-0:5+0.5) ) %>%
  mutate( lcl=pmin(pe,lcl) ) %>%
  mutate( delta=pe-lcl ) %>%
  mutate( f_delta=f*delta )

exp.expr <- "$\\sum_x f(x)*\\left ( pe(x) - lcl(x) \\right )$"  # <- Here
exp.delta <- format( round(sum( tab1$f_delta ),4), nsmall=4 )

tab2 <- tab1 %>%
  mutate( x=as.character(x), f=format(round(f,4),nsmall=4) ) %>%
  mutate( pe=format(round(pe,4),nsmall=4) ) %>%
  mutate( lcl=format(round(lcl,4),nsmall=4) ) %>%
  mutate( delta=format(round(delta,4),nsmall=3) ) %>%
  mutate( f_delta=format(round(f_delta,4),nsmall=4) ) %>%
  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="",f_delta="") ) %>%
  rbind( ., data.frame(x="", f="", pe="Exp", lcl="Diff", delta="=", f_delta=exp.expr) ) %>%
  rbind( ., data.frame(x="",f="",pe="",lcl="",delta="=",f_delta=exp.delta) ) %>%
  rbind( data.frame(x="x",f="f(x)",pe="pe(x)",lcl="lcl(x)",delta="pe(x)-lcl(x)",
                    f_delta="$f(x)\\times\\left(pe(x)-lcl(x)\\right)$"), . )  # <- And here
...