假设我有一个包含返回S3对象的函数的包:
new_myclass
return(structure(list(a=1, b=2), class = "myclass"))
}
我还有两个函数,它们接受一个myclass对象并分别返回一个HTML表示和一个对象的LaTeX表示.
myclass2html MyClass object
")}myclass2latex
我应该定义哪些函数/方法来提供一致且透明的knitr和rmarkdown支持?我想支持.Rmd文件和.R文件,标题如下:
#'---
#' title: My document
#' output: pdf_output
#'---
到目前为止,我的方法通过knit_print方法:
knit_print.myclass
rmarkdown_fmt
knitr_fmt
# 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和knitr :: opts_knit $get(“out.format”)可能定义也可能没定义(取决于是否正在使用rmarkdown).我发现这令人困惑.
> knit_print是为此目的定制的正确方法吗?
>了解输出格式的正确方法是什么?是否有get_output_format函数告诉我输出格式?
为了将问题放在上下文中,我正在研究condformat软件包,它允许使用条件格式规则可视化DataFrame.
编辑:到目前为止,我一直在做自己的伏都教来检测输出格式:
#' @importFrom rmarkdown metadata
#' @importFrom knitr opts_knit
guess_output_format
rmd_output
error = function(e) {NULL})
if (is.null(rmd_output)) {
rmd_output = ""
}
if (is.list(rmd_output)) {
rmd_output
}
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
if (format %in% c("html", "markdown")) {
return("html")
} else if (format %in% c("latex")) {
return("latex")
} else {
stop("Format not supported!")
}
}