2015-01-08 2 views
2

this question에서 {{var}}이라는 변수를 다른 프로그래밍 언어에서 echos라고 부를 수는 있지만, R에서 수행하는 작업을 수행하는 이유는 분실했습니다R/RMarkdown의 이중 중괄호 안에 변수 사용

즉, 다른 스크립트의 for 루프에 입력으로 공급되는 RMarkdown 템플릿 (여기서는 state_template.Rmd)에서 사용했습니다. 다른 스크립트에서 정의 된 벡터의 요소가 "자리"텍스트 충전

예 :

Dear `r paste(contacts$firstname[contacts$state == {{eachstate}}], sep = ", ")`,` 

이것은 for 루프 전달 allstates 각 상태에서 상대의 이름을 평가한다.

allstates <- state.abb 

for (eachstate in allstates) { 
    knit2html(input = 'state_template.Rmd', 
.... 
} 

답변

2

귀하의 경우 {{ }}에는 특별한 의미가 없습니다. 당신은 R에, 이들은

a<-1:10 
a[a%%2==1] 
a[a%%2=={{1}}] 
a[a%%2==((1))] 

당신은 너무 R.의 코드의 의미를 변경하지 않고 여분의 괄호/중괄호를 추가 할 수 있습니다 동일, 예를 들어

Dear `r paste(contacts$firstname[contacts$state == eachstate], sep = ", ")`, 

과 같은 결과를 얻을 것이다 당신의 사례, 달리기

sampleRmd<-'Dear `r paste(contacts$firstname[contacts$state == eachstate], sep = ", ")`' 
knit(text=sampleRmd, quiet=T) 

는 똑같이 작동합니다. contacts 변수가 현재 환경으로 해석되는 것처럼 eachstate 변수도 마찬가지입니다. 중괄호를 사용하거나 사용하지 않더라도 차이는 없습니다. 직접 인라인 코드 블록을 구문 분석 함수를 호출 할 경우 이중 중괄호는 종종 "템플릿"언어로 사용되며 knitr 당신은을 정의 할 수 없다는 것입니다

knitr:::parse_only('paste(contacts$firstname[contacts$state == {{eachstate}}], sep = ", ")') 
# expression(paste(contacts$firstname[contacts$state == { 
#  { 
#   eachstate 
#  } 
# }], sep = ", ")) 

잡기에 무슨 일이 일어나고 있는지 더 분명 수 있습니다 템플릿. 이러한 템플릿은 기본적으로 R의 현재 범위에있는 변수 값으로 텍스트의 값을 바꿀 수있는 텍스트 청크입니다.이 대체는 knit_expand() 함수로 수행됩니다. 여기

sampleRmd<-'Dear `r paste(contacts$firstname[contacts$state == {{eachstate}}], sep = ", ")`' 

contacts <- data.frame(
    firstname=c("Adam","Becky","Clement","David"), 
    state=c("MI","CA","CA","MI") 
) 

eachstate <- "MI" 
res <- knit_expand(text=sampleRmd) 
res 
# [1] "Dear `r paste(contacts$firstname[contacts$state == MI], sep = \", \")`" 

기본적으로 그냥 {{}} 사이에 아무것도 외모와 같은 이름의 변수의 값으로하는 것이 대체 귀하의 경우 최소한의 예입니다. 이 경우 {{eachstate}}이이 예제에서 "MI"eachstate 변수의 현재 값으로 바뀝니다. 이것은 R 코드가 실행되기 전에 수행됩니다. 당신이 knit()하려고하면이 당신이 확장 기능은 MI의 리터럴 값에 넣어 때문에이 오류

knit(text=res) 
# Error in NextMethod("[") : object 'MI' not found 

를 얻을 않습니다 그것은 마치 어디 코드로 문자열. 가치를 인용하지 않았습니다. 템플릿을

sampleRmd<-'Dear `r paste(contacts$firstname[contacts$state == "{{eachstate}}"], sep = ", ")`' 
res <- knit_expand(text=sampleRmd) 
knit(text=res, quiet=T) 
# [1] "Dear Adam, David" 

으로 변경해야합니다.하지만 예제에서는 템플릿 기능을 사용하지 않고 있습니다. 기본적으로 R 표현식에 불필요한 기호를 추가하는 것입니다.

+0

@Nicapyke 답변을 업데이트했습니다. 처음에는 내가 틀렸어. 중괄호는 실제로 당신의 예제에서 절대적으로 아무것도하지 않습니다. – MrFlick

+0

이것은 훌륭한 답변입니다. @MrFlick! 사려 깊은 의견에 감사드립니다. 나는 당신의 지식을 전할 것입니다 ... 나는 슬라이드를 {{}}의 사용에 관해 준비 할 준비가되어 있습니다. 그리고 당신은 템플릿 언어로 그들의 사용법에 대해 내가 가진 것보다 훨씬 잘 설명해주었습니다. – mcjudd

관련 문제