2014-11-18 10 views
13

मैं खंड नामों की सूची के आधार पर खंड विकल्प "eval" सेट करना चाहता हूं। क्या knitr में खंड नाम प्राप्त करने के लिए कोई फ़ंक्शन है, उदा। chunk_name?knitr में खंड नाम कैसे प्राप्त करें?

यह नकली फ़ंक्शन नाम "chunk_name" के साथ मेरा न्यूनतम उदाहरण है।

--- 
output: html_document 
--- 

```{r setup} 
eval_chunks <- c('chunk1') 
``` 

```{r chunk1, eval=chunk_name() %in% eval_chunks} 
plot(cars) 
``` 


```{r chunk2, eval=chunk_name() %in% eval_chunks} 
plot(cars) 
``` 

किसी भी सुझाव के लिए धन्यवाद। अगर मेरा प्रश्न स्पष्ट नहीं है तो कृपया मुझे बताएं।

+1

हिस्सा नाम मान लिया जाये कि परिवर्तन नहीं करते, तो आप एक नामित तार्किक वेक्टर' eval_chunk <बना सकते हैं:

यह मेरा नमूना RMD फाइल है '{आर chunk1, eval = eval_chunk [" chunk1 "]}'। –

+0

कोई भी हुक नियोजित करने का प्रयास कर सकता है। –

+1

@ रोमन लूस्ट्रिक मेरे पास एक ही विचार था, लेकिन समस्या [यहां एक टिप्पणी में नोट किया गया] (http://stackoverflow.com/questions/24687728/knitr-overwrite-chunk-options-with-hook-function#comment38286506_24687728), है हुक को बुलाए जाने से पहले उस खंड विकल्पों का मूल्यांकन किया जाता है, इसलिए यह वास्तव में काम नहीं करता है। – Thomas

उत्तर

9

Knitr 2012 (आवश्यकता अधिक गूगल, https://github.com/yihui/knitr/issues/73) के बाद से एक हिस्सा अंदर लेबल प्रदान की है। - सी (chunk1 = सही, chunk2 = false) `और फिर कहते हैं कि

--- 
output: html_document 
--- 

```{r setup} 
library(knitr) 
eval_chunks <- c('chunk1', 'chunk3') 
``` 

```{r chunk1, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 


```{r chunk2, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 


```{r chunk3, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 
1

मुझे लगता है कि यह समाधान अपूर्ण है क्योंकि यह सुनिश्चित करने में थोड़ा ध्यान देने की आवश्यकता है कि सही हिस्सों का मूल्यांकन किया जाए, लेकिन यह समस्या के आसपास हो जाती है कि हुक को बुलाए जाने से पहले खंड विकल्पों का मूल्यांकन किया जाता है। संक्षेप में, यह एक हुक का उपयोग नहीं करता है, बल्कि इसके बजाय इस तथ्य का उपयोग करता है कि खंड विकल्प आर अभिव्यक्ति हो सकते हैं। इस मामले में, एक फ़ंक्शन e() का उपयोग किया जाता है जो वैश्विक काउंटर वैरिएबल पर निर्भर करता है ताकि यह निर्धारित किया जा सके कि किसी विशेष खंड का मूल्यांकन किया जाना चाहिए या नहीं। चूंकि भाग का मूल्यांकन क्रम में किया जाता है, यह काम करता है। नीचे दिए गए उदाहरण में, chunk1 और chunk3 का मूल्यांकन किया जाता है, लेकिन अन्य नहीं हैं।

--- 
output: html_document 
--- 

```{r setup} 
library("knitr") 
.i <- 2 # `setup` is the first chunk, so start at 2 
.x <- all_labels() %in% c("chunk1", "chunk3") 
e <- function(){ 
    d <- .x[.i] 
    .i <<- .i + 1 
    d 
} 
``` 

```{r chunk1, eval=e()} 
x <- 1 
x 
``` 

```{r chunk2, eval=e()} 
x <- 2 
x 
``` 

```{r chunk3, eval=e()} 
x <- 3 
x 
``` 

```{r chunk4, eval=e()} 
x <- 4 
x 
``` 
+1

"चूंकि क्रम में खंड का मूल्यांकन किया जाता है"। क्या यह मामला है? (सीएफ 'निर्भर करता है') – baptiste

+2

@baptiste मैं इसे एक जटिल दस्तावेज़ में आजमाने की कोशिश नहीं करना चाहता। – Thomas

+0

@ थॉमस आपके सुझाव के लिए धन्यवाद। मैं जटिल दस्तावेज़ (मेरे मामले में) के बारे में आपके बिंदु से सहमत हूं, खासकर जब भाग जोड़ना/निकालना। – Bangyou

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