首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试lapply/sapply调用

调试lapply/sapply调用
EN

Stack Overflow用户
提问于 2009-09-08 18:42:37
回答 7查看 6.8K关注 0票数 35

使用lapply和friends编写的代码通常看起来更美观,而且比循环更具Rish。我和其他人一样喜欢,但是我怎么在出错的时候调试它呢?例如:

代码语言:javascript
复制
> ## a list composed of numeric elements 
> x <- as.list(-2:2)
> ## turn one of the elements into characters
> x[[2]] <- "what?!?"
> 
> ## using sapply
> sapply(x, function(x) 1/x)
Error in 1/x : non-numeric argument to binary operator

如果我使用了for循环:

代码语言:javascript
复制
> y <- rep(NA, length(x))
> for (i in 1:length(x)) {
+     y[i] <-  1/x[[i]]
+ }
Error in 1/x[[i]] : non-numeric argument to binary operator

但我会知道错误发生在哪里:

代码语言:javascript
复制
> i
[1] 2

当我使用lapply/sapply时,我应该怎么做?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-09 20:40:01

使用标准的R调试技术准确地在错误发生时停止:

代码语言:javascript
复制
options(error = browser) 

代码语言:javascript
复制
options(error = recover)

完成后,恢复为标准行为:

代码语言:javascript
复制
options(error = NULL)
票数 26
EN

Stack Overflow用户

发布于 2009-09-08 18:59:01

如果你用try()语句包装你的内部函数,你会得到更多信息:

代码语言:javascript
复制
> sapply(x, function(x) try(1/x))
Error in 1/x : non-numeric argument to binary operator
[1] "-0.5"                                                    
[2] "Error in 1/x : non-numeric argument to binary operator\n"
[3] "Inf"                                                     
[4] "1"                                                       
[5] "0.5"

在这种情况下,您可以看到哪个索引失败。

票数 26
EN

Stack Overflow用户

发布于 2009-09-08 23:48:11

使用带有.inform = TRUE的plyr包

代码语言:javascript
复制
library(plyr)
laply(x, function(x) 1/x, .inform = TRUE)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1395622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档