2017-01-18 8 views
6

समस्या

मेरे इनलाइन कोड हिस्सा टूट जाता है जब मैं filter() या select() एक स्तंभ नाम सफेद स्थान है कि मैं सामान्य रूप से dplyr में बैकटिक साथ परिभाषित करेगा है।Rmarkdown: इनलाइन dplyr कोड लिखने यदि स्तंभ नाम बैकटिक के साथ परिभाषित रिक्त स्थान है

उदाहरण डाटा

```{r setup, include=FALSE} 
    knitr::opts_chunk$set(echo = TRUE) 
    library(dplyr) 
    library(knitr) 
    library(lazyeval) 

    df <- structure(list(1:3, 2:4), .Names = c("a", "b"), row.names = c(NA, -3L), class = "data.frame") 

    df <- df %>% select(`a a`=a, `b b`=b) 
    ``` 

इनलाइन कोड हिस्सा

मैं `r df %>% filter(`a a` == 1) %>% select(`a a`) %>% as.numeric()` की तरह कुछ कोशिश कर रहा हूँ, लेकिन मैं निम्नलिखित त्रुटि मिलती है: (

Error in base::parse(text = code, keep.source = FALSE) : <text>:2.0: unexpected end of input 1: df %>% filter(^ Calls: <Anonymous> ... inline_exec -> withVisible -> eval -> parse_only -> <Anonymous> 

... बहुत स्पष्ट कारणों के लिए बैकटिक्स इनलाइन कोड खंड को समाप्त करते हैं)। मैं पूर्णांक गणनाओं के बाद कोड कोड में कॉलम का नाम बदल सकता हूं (मैं उन्हें तालिका के लिए स्वरूपित कर रहा हूं), लेकिन इसे तोड़ना निराशाजनक होगा।

महंगे lazyeval समाधान

यह समस्या हल करती है r df %>% filter_(interp(~ which_column == 1, which_column = as.name("a a"))) %>% select_(as.name("a a")) %>% as.numeric(), लेकिन वहाँ एक बेहतर तरीका हो गया है।

+1

क्या आप बैक टिक के लिए एस्केप ऑपरेटर का उपयोग कर सकते हैं? –

+3

क्या आप केवल सिंगल या डबल टिक का उपयोग कर सकते हैं? 'df%>% select ('a a' = a, 'b b' = b) 'मेरे लिए समान कार्य करता है (कम से कम कंसोल पर)। बैकटिक्स का उपयोग करने के लिए मुझे केवल * आवश्यकता है * संदर्भित (उपयोग नहीं कर रहा है) "विशेष" फ़ंक्शन जैसे '''%% '' '' '' '' ' – r2evans

+2

या, ज़ाहिर है, आप केवल फैंसी कंप्यूटेशंस इनलाइन नहीं कर सकते हैं। 'Res = df%>% फ़िल्टर (\ 'aa \' == 1)%>% चुनें (\ 'aa \')%>% as.numeric() 'अपने खंड/ब्लॉक में और फिर' \ 'r res \ '' यह इनलाइन है। – Frank

उत्तर

1

मुझे यकीन नहीं है कि आप चीजें कैसे चल रहे हैं - यहां मैं knitr के संबंध में उत्तर प्रदान करता हूं।

इस मामले के लिए कोई आसान समाधान नहीं है, और भाग के अंदर कुछ कोड को स्थानांतरित करने के आसपास काम (जैसा कि टिप्पणियों में से एक में सुझाव दिया गया है) शायद जाने का तरीका है।

भविष्य के संदर्भ और आगे की जानकारी के लिए, मैं अभी भी अंतर्निहित समस्या और वैकल्पिक समाधान साझा करूंगा।

ध्यान दें कि knitrinline.code के लिए निम्नलिखित पैटर्न का उपयोग (आप Rmarkdown प्रारूप का उपयोग कर रहे दिए गए) बनाता है: stringr::str_match_all के लिए एक कॉल, जो एक या के पैटर्न की पहचान करेगा के माध्यम से

knitr::all_patterns$md$inline.code 
[1] "`r[ #]([^`]+)\\s*`" 

अब समारोह knitr:::parse_inline मैचों इस एकाधिक गैर-बैकटिक्स ([^`]+), उसके बाद शून्य या एकाधिक स्पेस-क्लास तत्व (\\s*) के बाद, बैक-टिक के बाद।

तो यह `r के बाद पहली बैकटिक पर समाप्त होगा, इससे कोई फर्क नहीं पड़ता कि इससे कोई फर्क नहीं पड़ता। यह कुछ समझ में आता है, क्योंकि parse_inline में इनपुट की रेखाएं ध्वस्त हो गई हैं और वास्तव में परिणामस्वरूप स्ट्रिंग में बैक-टिक युक्त कई इनलाइन-कोड कथन और सादे पाठ हो सकते हैं।

यदि आप अपने आप को कुछ सम्मेलनों पर प्रतिबंधित करते हैं, तो आप अलग-अलग इनलाइन कोड टुकड़ों के अंत का पता लगाने के लिए पैटर्न को संशोधित कर सकते हैं। नीचे मैं मान रहा हूं कि इनलाइन कोड के टुकड़े के बाद मैं हमेशा एक नई लाइन पर टूट जाता हूं, उदाहरण के लिए

Hello there. 

`r DF %>% filter(`a a` == 1) %>% select(`a a`) %>% as.numeric()` 

This should read 1 above here. 

तो मैं निम्नलिखित तरीके से बुनी कर सकते हैं, पैटर्न को संशोधित करने के लिए एक बैकटिक एक नई लाइन को तोड़ने के बाद जब तक सब कुछ लेने के लिए:

library(knitr) 
opts_knit$set('verbose' = TRUE) 
knit_patterns$set(all_patterns$md) 
inline.code.2 <- "`r[ #](.+)\\s*`\n" 
knitr::knit_patterns$set(inline.code = inline.code.2) 

knit2html("MyRmarkdownFile.rmd") 
browseURL("MyRmarkdownFile.html") 

अपने setup हिस्सा निम्नलिखित मैं केवल निम्न होना इस पैटर्न के लिए एक सामान्य नियम ढूँढना जो हर किसी के लिए काम करता है असंभव लगता है।

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