2016-04-13 28 views
9

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

+0

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

+0

Teşekkürler. Evet, bu sadece yığın seçenekleri için çalışacaktır – Hugh

cevap

5

Kurulum yığınında include=FALSE seçeneği ile, aşağıdaki çıktı için aşağıdaki gibi çalıştı. Sizin için işe yaramazsa ben yazı

enter image description here silecektir

\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 Çıkışı:

>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 Çıkışı: Ben

>texi2pdf("test.tex") 
> 

kullanma MikTex 2.9, Windows üzerinde 1.9, R 3.0.2, log dosyalarını ekleyebilirseniz, herhangi bir

+0

Bu yüzden derlemeyi başaramadım, ama bunu biraz daha araştırmak istiyorum. Dosyanızı knitr :: knit'ken ne kazanıyorsunuz? – Hugh

+0

bu benim için işe yaramıyor – rawr

+0

Bunu “test.Rnw' içinde kütüphane (knitr)” olmadan çalışmaya nasıl başlıyorsunuz? – Hugh

İlgili konular