gpt4 book ai didi

r - Sexpr 中的错误处理

转载 作者:行者123 更新时间:2023-12-03 00:58:10 24 4
gpt4 key购买 nike

如何允许 \Sexpr 中出现错误?

我有一个knitr文档。本文档的一小部分涉及到无法共享的文件。因此,每当为某个依赖于正在读取的文件的对象 a 调用 \Sexpr{a} 时,它都会返回错误。我希望 \Sexpr 打印它遇到了错误。

例如,

\documentclass{article}
\usepackage{xcolor} % for red

\begin{document}

<<>>=
x <- 1
@

The value of $x$ is \Sexpr{x}

<<>>=
a <- scan("secret_file.txt")
@
The value of $a$ is \Sexpr{a}.

\end{document}

不会编译(当 secret_file.txt 不存在时)。我希望输出看起来像: Sexpr-error-detected

我认为更改 inline 钩子(Hook)会起作用,但放置以下 block 没有任何区别。

<<Sexpr-setup>>=
library(knitr)
knit_hooks$set(inline = function(x){
out <- tryCatch(
{
if (is.numeric(x))
x = round(x, getOption("digits"))
paste(as.character(x), collapse = ", ")
},
error = function(cond){
return("\\textcolor{red}{\\textbf{Sexpr error!}}")
invisible(NULL)
},
warning = function(cond){
return("\\textcolor{red}{\\textbf{Sexpr warning!}}")
invisible(NULL)
}
)
return(out)
})
@

自定义错误消息并不是必需的,只需从输出中清除错误并且不会阻止编译即可。我很高兴我可以将查找替换为类似 \Sexpr{XX() 的内容,并预先定义一个函数 XX() 来执行相同的 tryCatch > 机动,但我想 knitr could do this

<小时/>

在上面调用 knitr::knit 并应用回溯显示:

11: eval(expr, envir, enclos)
10: eval(parse_only(code[i]), envir = envir)
9: withVisible(eval(parse_only(code[i]), envir = envir))
8: inline_exec(block)
7: in_dir(opts_knit$get("root.dir") %n% input_dir(), inline_exec(block))
6: call_inline(x)
5: process_group.inline(group)
4: process_group(group)
3: withCallingHandlers(if (tangle) process_tangle(group) else process_group(group),
error = function(e) {
setwd(wd)
cat(res, sep = "\n", file = output %n% "")
message("Quitting from lines ", paste(current_lines(i),
collapse = "-"), " (", knit_concord$get("infile"),
") ")
})
2: process_file(text, output)
1: knitr::knit("knitr-prevent-errors.Rnw", quiet = TRUE)

从下面的函数来看,错误似乎在

eval(parse_only(code[i]), envir = envir)

其中code[i]a。我是否认为解决此问题的唯一方法是将 v = 开头的行更改为 tryCatch

最佳答案

使用设置 block 中的选项 include=FALSE,以下内容对我有用,输出如下。如果它不适合你,我会删除帖子

enter image description here

\documentclass{article}
\usepackage{xcolor} % for red


<<setup, include=FALSE>>=
knit_hooks$set(inline = function(x) {

out <- tryCatch(
{
if (is.numeric(x))
x = round(x, getOption("digits"))
paste(as.character(x), collapse = ", ")
},
error = function(cond){
return("\\textcolor{red}{\\textbf{Sexpr error!}}")
invisible(NULL)
},
warning = function(cond){
return("\\textcolor{red}{\\textbf{Sexpr warning!}}")
invisible(NULL)
}
)

return(out)

})
@



\begin{document}

<<>>=
x <- 1
@

The value of $x$ is \Sexpr{x}

<<>>=
a <- scan("secret_file.txt")
@
The value of $a$ is \Sexpr{a}.

\end{document}

针织输出:

>knitr::knit("test.Rnw")


processing file: test.Rnw
|......... | 14%
ordinary text without R code

|................... | 29%
label: setup (with options)
List of 2
$ include: logi FALSE
$ indent : chr " "

|............................ | 43%
ordinary text without R code

|..................................... | 57%
label: unnamed-chunk-1 (with options)
List of 1
$ indent: chr " "

|.............................................. | 71%
inline R code fragments

|........................................................ | 86%
label: unnamed-chunk-2 (with options)
List of 1
$ indent: chr " "

|.................................................................| 100%
inline R code fragments


output file: test.tex

[1] "test.tex"

文本输出:

>texi2pdf("test.tex")
>

我在 Windows 上使用 MikTex 2.9、knitr 1.9、R 3.0.2,您能否附上您的日志文件,以便我们比较差异(如果有)

关于r - Sexpr 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com