\Sexpr
içindeki hatalara nasıl izin veririm?Sexpr içinde hata giderme
Bir knitr belgesine sahibim. Bu belgenin küçük bir kısmı, paylaşılamayacak bir dosyaya başvurmaktadır. Bu nedenle, okunan dosyaya bağlı olan a
bazı nesneler için \Sexpr{a}
çağrıldığında, bir hata döndürür. Bunun bir hatayla karşılaştığını yazdırmak için \Sexpr
olmasını isterim. Örneğin
, (secret_file.txt
mevcut değilken)
\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}
derlenmeyecektir. Çıktının şu gibi bir şey görmesini isterim:
inline
kancasının çalışacağını düşünürdüm ama şu parçayı koymak hiç bir değişiklik yapmamıştı.
<<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)
})
@
hatalar çıkışından nettir ve derleme engel bulunmadığı anlamına, özel bir hata mesajı olduğunu şart değildir. Ben \Sexpr{XX(
gibi bir şey yerine bir bulmak yerine ve aynı maneouvre yapar bir fonksiyon tanımlamak için takdir ediyorum, ama ben knitr
could do this düşündüm. Yukarıda üzerinde knitr::knit
çağrılması ve Traceback uygulayarak
gösterir:
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)
işlevleri aşağıdaki, hata code[i]
olduğunu
eval(parse_only(code[i]), envir = envir)
aşağı düşük olduğunu görünür itibaren a
. Bunu çözmenin tek yolunun v =
'un tryCatch
ile başlayan hattını değiştirmek olduğunu düşünüyorum.
farklarını karşılaştırabiliriz. Cevabın [buradan] emin olun (https://stackoverflow.com/questions/ 24978427/bastırma-hata mesajları-in-knitr) sorununuza adapte edilebilir. Josh O'Brien'ın cevabı, hata kanca işlevini değiştirir. Knitr belgeleri [burada] (http://yihui.name/knitr/hooks/), bu kancanın hem parçalar hem de satır içi kod için hataları ele aldığını öne sürmektedir. 'error: stop() 'den gelen hatalar (hem kod parçalarında hem de satır içi R kodundaki hatalar için geçerlidir).Ben kod ile 'knit_hooks $ set (error = myErrorFunction)' ekleme ile hızlı bir oyun vardı ama yine de '\ Sexpr {a}' ile derlemek için alamadım. – Graeme
Teşekkürler. Evet, bu sadece yığın seçenekleri için çalışacaktır – Hugh