簡體   English   中英

在rmarkdown和knitr中打印自定義對象(PDF和HTML)

[英]Print custom object in rmarkdown and knitr (PDF and HTML)

假設我有一個帶有返回S3對象的函數的包:

new_myclass <- function() {
  return(structure(list(a=1, b=2), class = "myclass"))
}

我也有兩個函數,它們帶有一個myclass對象,並分別返回該對象的HTML表示形式和LaTeX表示形式。

myclass2html <- function(obj) { return("<p>MyClass object</p>")}
myclass2latex <- function(obj) { return("\begin{em}MyClass\end{em} object $x$")}

我應該定義哪些函數/方法來提供一致和透明的knitrrmarkdown支持? 我想同時支持.Rmd文件和.R文件,其標題如下:

#'---
#' title: My document
#' output: pdf_output
#'---

到目前為止,我的方法是通過knit_print方法進行的:

knit_print.myclass <- function(x, ...) {
  rmarkdown_fmt <- rmarkdown::metadata$output
  knitr_fmt <- knitr::opts_knit$get("out.format")
  # should I use these heuristics with both variables?
  if (rmarkdownfmt == "pdf_document") {
    return(knitr::asis_output(myclass2latex(x)))
  }
  if (knitr_fmt %in% c("html", "markdown")) {
    return(knitr::asis_output(myclass2html(x)))
  } else {
    stop("Format not supported!")
  }
}

我的主要問題是可能存在或可能rmarkdown::metadata$output兩個變量rmarkdown::metadata$outputknitr::opts_knit$get("out.format") (取決於是否使用rmarkdown )。 我覺得這很混亂。

  • knit_print是否是為此目的定制的正確方法?
  • 什么是知道輸出格式的正確方法? 是否有一個get_output_format函數可以告訴我輸出格式?

為了解決這個問題,我正在研究condformat包,該包允許使用條件格式設置規則可視化DataFrame。

編輯:到目前為止,我一直在做我自己的伏都教以檢測輸出格式:

#' @importFrom rmarkdown metadata
#' @importFrom knitr opts_knit
guess_output_format <- function() {
  rmd_output <- tryCatch({rmarkdown::metadata$output},
                         error = function(e) {NULL})
  if (is.null(rmd_output)) {
    rmd_output = ""
  }
  if (is.list(rmd_output)) {
    rmd_output <- names(rmd_output)[1]
  }
  if (rmd_output == "pdf_document") {
    return("latex")
  } else if (rmd_output %in% c("html_document", "html_vignette")) {
    return("html")
  } else if (rmd_output != "") {
    stop("Unsupported rmarkdown output format:", rmd_output)
  }
  # No rmarkdown, let's try with knitr:
  format <- knitr::opts_knit$get("out.format")
  if (format %in% c("html", "markdown")) {
    return("html")
  } else if (format %in% c("latex")) {
    return("latex")
  } else {
    stop("Format not supported!")
  }
}

編輯 :這里有進一步的討論: https : //github.com/rstudio/rmarkdown/issues/649

使用knitr 1.18,這要簡單得多:

guess_output_format <- function() {
  if (knitr::is_html_output()) {
    return("html")
  } else if (knitr::is_latex_output()) {
    return("latex")
  } else {
    return("unsupported")
 }
}

相關問題: https//github.com/rstudio/rmarkdown/issues/649

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM