如何在R中實現F#的前向管道運算符?操作員可以輕鬆鏈接一系列計算。例如,當你有一個輸入data
,想調用函數foo
和bar
順序,你可以這樣寫:如何在R中實現F#的前向管道運算符?
data |> foo |> bar
而不是寫bar(foo(data))
的。好處是您可以避免使用一些括號,並且計算的編寫順序與執行順序相同(從左到右)。在F#中,運營商的定義如下:
let (|>) a f = f a
這樣看來%...%可用於二元運算符,但如何將這項工作?
如何在R中實現F#的前向管道運算符?操作員可以輕鬆鏈接一系列計算。例如,當你有一個輸入data
,想調用函數foo
和bar
順序,你可以這樣寫:如何在R中實現F#的前向管道運算符?
data |> foo |> bar
而不是寫bar(foo(data))
的。好處是您可以避免使用一些括號,並且計算的編寫順序與執行順序相同(從左到右)。在F#中,運營商的定義如下:
let (|>) a f = f a
這樣看來%...%可用於二元運算符,但如何將這項工作?
,我不知道它會如何容納任何實際用途,但是這似乎(?)做你想做的事情,至少對於單參數函數......
> "%>%" <- function(x,f) do.call(f,list(x))
> pi %>% sin
[1] 1.224606e-16
> pi %>% sin %>% cos
[1] 1
> cos(sin(pi))
[1] 1
PS'do.call'可能是多餘的 - 函數體可能只是'f(x)',但如果你想允許多個參數àla(list)(1,5)%>%[back -quote] x [back-quote]'你需要'do.call' ... – 2012-01-17 16:26:59
問題是,你正在談論調用函數的完全不同的範例,所以它不是很清楚你想要什麼。 [R只使用F中什麼#是元組參數(在讀命名),所以認爲它的一個方法是平凡
fp = function(x, f) f(x)
因此,例如
> fp(4, print)
[1] 4
這相當於將要執行的呼叫,但不會在非元組的情況下工作就像4 |> f x y
因爲在R.沒有這樣的事情你可以嘗試效仿F#的功能特性,但它會很尷尬:
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使用的功能和必要的範式的混合物,所以它不執行參數值匹配等
編輯它不是單純的功能:,因爲你改變了問題,你有興趣的語法和只特殊情況下,只是上面的中間符號替換fp
:(採用本的運營商;)
`%>%` = function(x, f) f(x)
> 1:10 %>% range %>% mean
[1] 5.5
)
編輯:現在打包在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#管,誰不?
你能舉個例子嗎? – krlmlr 2014-03-17 22:11:02
如果您更清楚地告訴我們這個操作員實際應該做什麼,這將有很大幫助,因此我們不必爲自己挖掘信息。也許你的問題說明了這一點,但對我來說這有點太電報。 – 2012-01-17 15:03:06