2017-03-29 3 views
1

내 질문에 더 구체적인 제목이 아니므로 미안하지만 문구를 잘 모르겠습니다.R의 함수 선언 및 평가?

난 그냥 함수 선언은 R.에서 작동 fn2 작품과 fn1하지 않도록

library(magrittr) 
library(compiler) 

fn1 <- function(x) {x + 1} %>% cmpfun() 
fn2 <- (function(x) {x + 1}) %>% cmpfun() 

fn1(1) # gives an error 
fn2(1) # works as expected 

왜 내가 함수 선언을 괄호가 필요합니까 방법을 이해하려고? 하지 function 호출 function에 일반 구문 ... 도움말 페이지에서 순종 (함수 선언에서와 같이) 왜 function하면

다음, 다른 모든 기능처럼, 그 구문은 다음과 같습니다

function(arglist) expr 
return(value) 

답변

2

fn1 <- function(x) {x + 1} %>% cmpfun() 

그래서 문서와 같은

fn1 <- function(x) { 
    {x + 1} %>% cmpfun() 
} 

과 동일 말한다 때문에 : function(arglist) expr - function(x) 후 기본적으로 모든 것이 하나의 표현으로 간주되고있다. 괄호가 있으면 표현식을 "중지"할시기를 알 수 있습니다. 제 실제로 파이프 오퍼레이터를 호출하는 동안 그래서 제 단지 함수를 정의하는보다

fn2 <- `%>%`(function(x) {x + 1}, cmpfun()) 

같은 어떤

fn2 <- (function(x) {x + 1}) %>% cmpfun() 

상이한

.

2

그것은 우선 순위의 질문 : 첫 번째 선언은

fn1 = function(x) ({x + 1} %>% cmpfun()) 

에 해당, cmpfun가없는 함수 선언 자체에 {x + 1}의 결과라고합니다.

불행히도 이러한 우선 순위 규칙에 대한 문서를 찾을 수 없으며 R에 대한 공식 구문이 없다는 것은 R 소스 코드 자체 만이 유일한 소스라는 것을 의미합니다 (또는이 간단한 경우 관찰 가능한 런타임 행동). 의 목적이 여기 정말 관련이 없습니다 (-이 외에도에서

, 당신은 정상 구문

에 순종하는 이유 (함수 선언에서와 같이) 호출을 작동하지 않을 수 있습니다

요청 당신의 질문은 이 정상적인 구문을 따른다.) 이유는 : function은 R (if, for, ...)의 다른 것들처럼 언어에 의해 정의 된 특별한 구문을 따르는 특별한 형태이기 때문이다.

+0

특수 구문을 따르는 R의 다른 것들에 대해 언급 한 경우 1을 더한 것입니다. – plant