2017-04-24 53 views
0

NB:下面的示例使用謂詞is.na,但這僅僅是一個示例。我對一般情況感興趣。 (IOW,謂詞可能是is.infinite,或is.nan,或其他任何東西。)如何替換滿足謂詞「即時」的位置?


假設一些表達foo(...)評估爲可能包含在它的一些NA值的數據幀,並且該功能bar需要NA - 免費數據框作爲參數。避免將無效參數bar

一種方法需要一箇中間分配:

tmp <- foo(...) 
tmp[is.na(tmp)] <- 0 
bar(tmp) 

有一些功能baz,將允許與

bar(baz(foo(...), is.na, 0, ...)) 

做同樣的事情... 從而避免需要中間分配

我知道,我總是可以寫我自己的baz,但不知道是否像這樣的東西已經可以在R.


UPDATE:

(針對弗蘭克的評論。 )

x <- data.frame(K=1001:1005, 
       I=3:7, 
       R=c(0.1, 0.2, 0.3, 0.4, 0.5), 
       B=c(TRUE, FALSE, TRUE, FALSE, TRUE), 
       C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, 0.7+0.8i, 0.9+1.0i)) 

y <- data.frame(K=1001:1003, 
       S1=c("a", "b", "c"), 
       S2=c("d", "e", "f"), 
       stringsAsFactors = FALSE) 

有了這些定義,那麼foo(...)可能是表達

merge(x, y, all = TRUE, by = "K") 

bar,我想最簡單的事情將一些人工,像

bar <- function (nonas) { stopifnot(!any(is.na(nonas))); nonas } 

一個家庭軋baz可能是

baz <- function (thing, predicate, value) { 
    thing[predicate(thing)] <- value 
    thing 
} 

然後,

bar(merge(x, y, all = TRUE, by = "K")) 
## Error: !any(is.na(nonas)) is not TRUE 
bar(baz(merge(x, y, all = TRUE, by = "K"), is.na, -1)) 
##  K I R  B  C S1 S2 
## 1 1001 3 0.1 TRUE 0.1+0.2i a d 
## 2 1002 4 0.2 FALSE 0.3+0.4i b e 
## 3 1003 5 0.3 TRUE 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE 0.7+0.8i -1 -1 
## 5 1005 7 0.5 TRUE 0.9+1.0i -1 -1 
+0

您可以創建一個示例'tmp'來考慮至少嗎?似乎很有可能'替換'功能可能會這樣做... – Frank

+0

@Frank:我在我的文章中添加了一個示例。另外,我不知道'replace'如何避免賦值給一箇中間變量(如我的帖子中的'tmp')。 – kjo

+1

對不起,我沒有關注。你的文章似乎已經在'bar(baz(foo(),is.na,0))''where'foo = function()你的代碼中包含了一個正常的函數。你問是否這樣的函數已經存在於某些包中?順便說一句,如果你不喜歡中間變量和括號,有'foo()%>%替換(pred(。),0)%>%bar' – Frank

回答

4

爲了避免存儲foo()結果,一個可以做

library(magrittr) 
foo() %>% replace(pred(.), 0) %>% bar 

這種用法在?`%>%`記載:

使用用於其他目的

點r常常需要lhs的某些屬性或屬性除了lh本身的價值之外,hs還呼叫,例如,行數或列數。在rhs調用中多次使用點佔位符是完全有效的,但通過設計,在嵌套函數調用中使用它時,行爲會稍有不同。特別是,如果佔位符僅用於嵌套函數調用中,lhs也將作爲第一個參數放置!

通常情況下,管道速度可能會很慢,所以我不會使用它來表現出對性能至關重要的任何事情。我認爲OP的幫助函數baz對於這種情況非常有用,如bar(baz(foo(), is.na, 0))

相關問題