Sexpr

2016-04-13 5 views
9

में त्रुटि प्रबंधन \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 मौजूद नहीं है)। मैं आउटपुट को कुछ ऐसा दिखाना चाहता हूं: 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( जैसे किसी चीज़ को प्रतिस्थापित कर सकता हूं और एक फ़ंक्शन अपफ्रंट 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 के साथ लाइन को बदलना है?

+0

सुनिश्चित नहीं है कि उत्तर [यहां] (https://stackoverflow.com/questions/ 24 9 78427/दबाने-त्रुटि-संदेश-इन-knitr) आपकी समस्या के लिए अनुकूलित किया जा सकता है। जोश ओ'ब्रायन द्वारा जवाब त्रुटि हुक समारोह में परिवर्तन करता है। Knitr दस्तावेज [यहां] (http://yihui.name/knitr/hooks/) सुझाव देता है कि यह हुक दोनों भाग और इनलाइन कोड के लिए त्रुटियों को संभालता है। त्रुटि: स्टॉप() से त्रुटियां (कोड कोड और इनलाइन आर कोड दोनों में त्रुटियों पर लागू होती हैं) '।मैंने आपके कोड के साथ '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" 

टेक्स आउटपुट:

>texi2pdf("test.tex") 
> 

मैं कर रहा हूँ का उपयोग करते हुए विंडोज़ पर मिक्टेक्स 2.9, बुनाई 1.9, आर 3.0.2, क्या आप अपनी लॉग फाइल संलग्न कर सकते हैं तो हम अंतरों की तुलना कर सकते हैं यदि

+0

के लिए काम करेगा, इसलिए मुझे इसे संकलित करने के लिए नहीं मिला, लेकिन मैं इसे और अधिक खोजना चाहता हूं। जब आप 'knitr :: knit' अपनी फ़ाइल करते हैं तो आपको क्या मिलता है? – Hugh

+0

यह मेरे लिए काम नहीं करता – rawr

+0

'test.Rnw' में 'लाइब्रेरी (knitr)' के बिना काम करने के लिए आप इसे कैसे प्राप्त कर रहे हैं? – Hugh

संबंधित मुद्दे