में त्रुटि प्रबंधन \Sexpr
के भीतर त्रुटियों की अनुमति कैसे दे सकता हूं?Sexpr
मेरे पास एक बुनाई दस्तावेज़ है। इस दस्तावेज़ का एक छोटा सा हिस्सा उस फ़ाइल को संदर्भित करता है जिसे साझा नहीं किया जा सकता है। इसलिए जब भी \Sexpr{a}
किसी ऑब्जेक्ट a
के लिए कॉल किया जाता है जो उस फ़ाइल को पढ़ने पर निर्भर करता है, तो यह एक त्रुटि देता है। मैं इसे प्रिंट करने के लिए \Sexpr
के बजाय चाहूंगा कि इसमें कोई त्रुटि आई।
,
\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}
संकलन नहीं होगा (जब secret_file.txt
मौजूद नहीं है)। मैं आउटपुट को कुछ ऐसा दिखाना चाहता हूं:
मैंने सोचा कि 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(
जैसे किसी चीज़ को प्रतिस्थापित कर सकता हूं और एक फ़ंक्शन अपफ्रंट XX()
परिभाषित करता हूं जो उसी tryCatch
मैन्यूवर करता है, लेकिन मैंने 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)
से निम्नलिखित कार्यों, ऐसा लगता है कि त्रुटि कम नीचे है
eval(parse_only(code[i]), envir = envir)
कहाँ code[i]
है पर a
। क्या मैं यह सोचने में सही हूं कि इसे हल करने का एकमात्र तरीका v =
से tryCatch
के साथ लाइन को बदलना है?
सुनिश्चित नहीं है कि उत्तर [यहां] (https://stackoverflow.com/questions/ 24 9 78427/दबाने-त्रुटि-संदेश-इन-knitr) आपकी समस्या के लिए अनुकूलित किया जा सकता है। जोश ओ'ब्रायन द्वारा जवाब त्रुटि हुक समारोह में परिवर्तन करता है। Knitr दस्तावेज [यहां] (http://yihui.name/knitr/hooks/) सुझाव देता है कि यह हुक दोनों भाग और इनलाइन कोड के लिए त्रुटियों को संभालता है। त्रुटि: स्टॉप() से त्रुटियां (कोड कोड और इनलाइन आर कोड दोनों में त्रुटियों पर लागू होती हैं) '।मैंने आपके कोड के साथ 'knit_hooks $ set (error = myErrorFunction)' जोड़ने के साथ एक त्वरित खेल किया था, लेकिन मैं अभी भी इसे '\ Sexpr {a}' के साथ संकलित नहीं कर सका। – Graeme
धन्यवाद। हां यह केवल इन-चंक विकल्प – Hugh