2017-04-24 52 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))

相关问题