2012-01-17 4 views
13

R에서 F #의 순방향 파이프 연산자를 어떻게 구현할 수 있습니까? 연산자를 사용하면 일련의 계산을 쉽게 연결할 수 있습니다. 당신이 입력 data을 가지고 기능 foobar 순서를 호출 할 때 예를 들어, 당신은 쓸 수 있습니다 :R에서 F #의 순방향 파이프 연산자를 구현하는 방법은 무엇입니까?

data |> foo |> bar 

을 대신 bar(foo(data))를 작성. 이점은 괄호를 사용하지 않고 계산을 실행 순서와 동일한 순서 (왼쪽에서 오른쪽으로)로 작성한다는 것입니다. F 번호에서 다음과 같이 연산자는 정의됩니다

let (|>) a f = f a 

그것은 그 %를 나타납니다 ... % 바이너리 연산자를 사용할 수 있습니다,하지만 어떻게이 작품은 것?

+6

우리가이 운영자가 실제로 무엇을해야 하는지를 조금 더 분명하게 말하면 많은 도움이 될 것입니다. 그래서 우리는 스스로 정보를 찾아 낼 필요가 없었습니다. 어쩌면 당신의 질문은 그것을 말하고 있지만, 그것은 나에게 너무 전신적입니다. –

답변

17

을하지만,이 보인다 : 특별한 경우, 그냥 중위 표기법 위 fp 교체 (?) 당신이 원하는 것을 할 수 있습니다. 적어도 단일 인수 함수에 ...

> "%>%" <- function(x,f) do.call(f,list(x)) 
> pi %>% sin 
[1] 1.224606e-16 
> pi %>% sin %>% cos 
[1] 1 
> cos(sin(pi)) 
[1] 1 
+0

PS'do.call'는 중복 될 수 있습니다 - 여러 인자를 허용하고 싶을지라도 함수의 몸체는 아마도'f (x)'일 수 있습니다 : list (1,5) %> [back -quote] x [back-quote]'do.call'이 필요합니다 ... –

5

문제는 당신이 완전히 다른 기능을 호출하는 패러다임에 대해 이야기하고 있으므로 사용자가 원하는 것이 분명하지 않다는 것입니다. R은 #이 (R에 이름) 튜플 인수 것, 그래서 생각하는 한 가지 방법은 하찮게입니다 F에서 무엇을 사용하는 예를 들어

> fp(4, print) 
[1] 4 

이 상당하므로 호출을 수행합니다

fp = function(x, f) f(x) 

하지만 당신은 F # 기능 동작을 에뮬레이션을 시도 할 수 R.에서 그런 일이 없기 때문에 4 |> f x y 같은 비 tupple의 경우에는 작동하지 않습니다,하지만 어색 할 것 :

fp = function(x, f, ...) function(...) f(x, ...) 

을 그 것이다 항상 작동하고 따라서 체인은 예를

> tri = function(x, y, z) paste(x,y,z) 
> fp("foo", fp("mar", tri))("bar") 
[1] "mar foo bar" 

위해 이렇게 작동하지만 R 함수에 불완전한 호출을 변환하지 않기 때문에 정말 유용하지 않습니다. 대신, R은 튜플 개념을 기반으로보다 유연한 호출을합니다. 당신이있는 질문을 변경 한 이후 구문에 관심이 만 : 그것은 등

편집 인수 값 매칭을 수행하지 않습니다 그래서 순수하게 작동하지, R은 기능적이고 필수적 패러다임의 혼합물을 사용합니다

`%>%` = function(x, f) f(x) > 1:10 %>% range %>% mean [1] 5.5 

이 (벤의 연산자 사용) 나는 그것이 실제 사용까지 개최 얼마나 잘 모르는)

7

수정 : 이제 CRAN 패키지 예제가 포함되어 있습니다.

magrittr 패키지가 만들어졌습니다.

install.packages("magrittr") 

예 :

또한
iris %>% 
    subset(Sepal.Length > 5) %>% 
    aggregate(. ~ Species, ., mean) 

, 네트를 참조하십시오 http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html 그것은 당신이 F 번호 파이프를 좋아하고, 사람이하지 않는 경우 꽤 유용한 기능을 가지고 있습니다!

+0

사용 예제를 보여 주시겠습니까? – krlmlr

관련 문제