\Sexpr
のエラーをどのように許可しますか?性別内のエラー処理
私はknitr文書を持っています。このドキュメントの一部は、共有できないファイルを指しています。したがって、読み取られているファイルに依存するオブジェクトa
に対して\Sexpr{a}
が呼び出されると、エラーが返されます。私は\Sexpr
の代わりにエラーが発生したことを印刷したいと思います。例えば
(secret_file.txt
が存在しない場合)、
\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}
inline
フックを変更すると効果があると思っていましたが、次のチャンクを入れても差は出ませんでした。
<<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(
のようなものに置き換えて見つけることができて、同じtryCatch
maneouvreを実行する機能の前払いXX()
を定義することができますが、私は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)
を、エラーが
code[i]
がある
eval(parse_only(code[i]), envir = envir)
でローダウンであることが表示されますa
。これを解決する唯一の方法はv =
を開始する行をtryCatch
に変更することだと思っていますか?
答えが[ここ](https://stackoverflow.com/questions/) 24978427/suppressing-error-messages-in-knitr)を問題に適応させることができます。 Josh O'Brienの答えはエラーフック機能を変更します。 knitrのドキュメント[here](http://yihui.name/knitr/hooks/)は、このフックがチャンクとインラインコードの両方のエラーを処理することを示唆しています。 'エラー:stop()からのエラー(コードチャンクとインラインRコードの両方のエラーに適用されます)'。あなたのコードに 'knit_hooks $ set(error = myErrorFunction)'を追加して素早く遊んでいましたが、 '\ Sexpr {a}'でコンパイルできませんでした。 – Graeme
ありがとうございます。はい、それはちょうどチャンクオプションのために働くでしょう – Hugh