2016-12-15 18 views
1

我转化用我自己的功能,我的数据如下:R:保留在`sapply`环警告作为载体

my_df %>% [...] %>% 
    mutate(my_result = sapply(id_column, my_function)) 

这里,my_function将执行一些计算,返回数值结果的每一行。该函数不能(很容易)被矢量化,这就是为什么我依赖于sapply。到现在为止还挺好。

有时,my_function会发出警告,表明应该用一粒盐做出具体结果。

我想捕获这些警告,并将它们追加到我的数据框中的新列。预期结果:

id_column | ... | result | warnings 1 | ... | result1 | NA 2 | ... | result2 | "Warning: something happened on id 2" 3 | ... | result3 | NA

我怎样才能做到这一点?

+2

使用'tryCatch'。我会告诉你细节,但这里没有可重复的例子,我也不会说话。 – Roland

+0

谢谢,看着这个伎俩,我会扩展到原始问题的答案。 – hdkrgr

回答

2

我会使用lapply来代替,所以你可以返回一行data.frame,每次有两列,rbind这个数据帧的列表在最后。

df <- data.frame(a=runif(20)-0.5) 

f <- function(x) { 
    tryCatch ({ 
     data.frame(result=log(x), warning=NA) 
    }, warning = function(w) { 
     data.frame(result=suppressWarnings(log(x)), warning=w$message) 
    }) 
} 

res <- cbind(df, do.call(rbind, lapply(df$a, f))) 
0

的替代@ mpjdem的答案,但有sapply住:

tryCatch.W.E返回一个列表

>> tryCatch.W.E(log(-5)) 
$value 
[1] NaN 
$warning 
<simpleWarning in log(-5): NaNs produced> 

在结合sapply这导致矩阵和原来的任务可以由解决

my_df %>% cbind(t(sapply(.$id_column, function(x) {tryCatch.W.E(my_function(x))})))