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:
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?
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
Danke. Ja, das funktioniert nur für In-Chunk-Optionen – Hugh