【发布时间】:2015-12-11 09:52:49
【问题描述】:
sapply 和 replicate(等)运行指定的次数。放入sapply(1:N, function(n){expr}) 将执行expr N 次。假设我希望 sapply 在 m 运行后停止。这可能不会出错吗? break 不起作用,for 或 while 循环在我的上下文中会太慢。
类似于:
sapply(1:N, function(n){
#some expression
if(identical(n, m)) break
})
除了 break 不起作用。
我正在尝试做的事情:
创建一个函数来读取具有已定义结构但长度未知的大型(二进制)数据文件。将replicate 与array(readBin(...), ...) 一起使用是我发现的最佳方法,但我希望在开始返回NA 时停止它(即到达文件末尾)。
【问题讨论】:
-
据我所知,R 中支持
for循环,并且 可以 使用,尽管名声不好。认为sapply比for循环更快是一种常见的误解。 -
我的经验是
for比apply家庭慢得多,我曾尝试使用for完成此任务(在我真正了解*apply之前)。有没有一些技巧可以让for工作得更快? -
for并不比*apply慢很多。它通常(有点)比lapply和vapply慢。视情况而定,可能比sapply慢或快。它通常比apply快。前提是您正确编写循环并且(比其他事情更多)避免增长对象并正确预分配。更详细地了解您的尝试,您可能会得到帮助。 -
@nicola
for本身实际上应该比其他循环更快(包括vapply)。你在里面做的事情会让它变慢。 -
@nicola 是的,但是您可以使用没有返回值的
for循环,这就是它获胜的地方。这就是我的意思,循环本身很快。