2016-04-13 12 views
9

Wie erlaube ich Fehler innerhalb \Sexpr?Fehlerbehandlung innerhalb von Sexpr

Ich habe ein Knitr Dokument. Ein kleiner Teil dieses Dokuments bezieht sich auf eine Datei, die nicht freigegeben werden kann. Wenn also \Sexpr{a} für ein Objekt a aufgerufen wird, das davon abhängt, dass diese Datei gelesen wird, wird ein Fehler zurückgegeben. Ich möchte stattdessen für \Sexpr drucken, dass es einen Fehler festgestellt.

Zum Beispiel

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

nicht kompiliert (wenn secret_file.txt nicht vorhanden ist). Ich möchte, dass die Ausgabe ungefähr wie folgt aussieht: Sexpr-error-detected

Ich dachte, dass das Ändern des inline Hooks funktionieren würde, aber das folgende Chunk machte keinen Unterschied.

Es ist nicht notwendig, eine benutzerdefinierte Fehlermeldung zu haben, nur dass Fehler von der Ausgabe klar sind und die Kompilierung nicht verhindern. Ich schätze, dass ich einen Fund ersetzen in etwas wie \Sexpr{XX( und definieren Sie eine Funktion im Voraus XX(), die das gleiche tryCatch maneouvre tut, aber ich dachte knitr could do this.


Aufruf knitr::knit auf der oben und die Rückverfolgung der Anwendung zeigt, dass:

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) 

aus den folgenden Funktionen, scheint es, dass der Fehler gering ist unten bei

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

Wo code[i] ist a. Habe ich recht, wenn ich daran denke, dass der einzige Weg, dies zu lösen, darin besteht, die Zeile zu ändern, die mit mit einer tryCatch beginnt?

+0

Nicht sicher, ob die Antwort [hier] (https://stackoverflow.com/questions/ 24978427/suppressing-error-messages-in-knitr) könnte an Ihr Problem angepasst werden. Die Antwort von Josh O'Brien ändert die Fehler-Hook-Funktion. Die knitr Dokumentation [hier] (http://yihui.name/knitr/hooks/) legt nahe, dass dieser Hook die Fehler sowohl für Chunks als auch für Inline-Code behandelt. 'error: errors from stop() (gilt für Fehler in Code-Chunks und Inline-R-Code)'.Ich hatte ein schnelles Spiel mit dem Hinzufügen von 'knit_hooks $ set (error = myErrorFunction)' 'mit Ihrem Code, aber ich konnte es immer noch nicht mit' \ Sexpr {a} 'kompilieren. – Graeme

+0

Danke. Ja, das funktioniert nur für In-Chunk-Optionen – Hugh

Antwort

5

Mit der Option include=FALSE im Setup-Chunk, funktionierte das folgende für mich mit der Ausgabe wie folgt. Wenn es nicht für Sie arbeiten werde ich den Posten

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 löschen Ausgang:

>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 Ausgang:

>texi2pdf("test.tex") 
> 

Ich bin verwenden MikTex 2.9, Knitr 1.9, R 3.0.2 unter Windows, können Sie bitte Ihre Protokolldateien anhängen, dann können wir die Unterschiede vergleichen, wenn

+0

Also habe ich es nicht zum kompilieren bekommen, aber ich würde das gerne ein bisschen mehr erkunden. Was bekommst du, wenn du deine Datei "knitst"? – Hugh

+0

funktioniert das nicht für mich – rawr

+0

Wie funktioniert das ohne 'library (knitr)' in 'test.Rnw'? – Hugh