2016-04-13 13 views
9

\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} 

はコンパイルされません。出力がSexpr-error-detected

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に変更することだと思っていますか?

+0

答えが[ここ](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

+0

ありがとうございます。はい、それはちょうどチャンクオプションのために働くでしょう – Hugh

答えて

5

セットアップチャンクのオプション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出力:

>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" 

TeX出力:私は

>texi2pdf("test.tex") 
> 

を使用してWindowsのMikTex 2.9、knitr 1.9、R 3.0.2では、ログファイルを添付して、差異を比較することができますか?

+0

私はそれをコンパイルすることはできませんでしたが、私はもう少しこれを探求したいと思います。あなたのファイルを 'knitr :: knit'すると何が得られますか? – Hugh

+0

これは私にとってはうまくいきません – rawr

+0

'test.Rnw'に' library(knitr) 'がなければ、これをどうやって動作させていますか? – Hugh