退出* apply中的函数

时间:2015-12-11 09:52:49

标签: r function apply exit

var newElement = '<div>' + // ... more HTML ... '</div>'; iElement.append( $compile(newElement)(scope) ); sapply(等)运行指定的次数。放replicate将执行sapply(1:N, function(n){expr})次N次。假设我想在m运行后停止expr。这可能不会出错吗? sapply不起作用,breakfor循环在我的上下文中会太慢。

类似于:

while

除了休息不起作用。

我正在尝试做什么:

创建一个函数来读入定义结构但长度未知的大(二进制)数据文件。将sapply(1:N, function(n){ #some expression if(identical(n, m)) break }) replicate一起使用是我发现这样做的最好方法,但我希望它在array(readBin(...), ...)开始返回时停止(即到达文件末尾)

3 个答案:

答案 0 :(得分:1)

for vs *apply之外,如果您的问题是在文件结束前使用readBin,请记住:

  • 你可以使用(小)高估n(要阅读的元素数量);
  • 您可以通过file.info(filename)$size了解文件的大小;那么你可以自己估计文件中包含多少元素。

例如,假设您正在读取整数(四个字节)值。试试吧:

readBin(con,"int",n=file.info(filename)$size/4+10)

一次性读取所有文件。 +10会稍微高估一下。

答案 1 :(得分:1)

部分解决方法可以是以全局控制变量

的形式使用
i<-TRUE
unlist( sapply(1:10, function(x){if(i){ if(x>=4)(i<<-FALSE); 2*x;}}) ) 

虽然它仍然运行n次,但至少它不会每次执行操作并且节省资源。 我无法弄清楚为什么简化不能一直工作,我不得不使用unlist。

答案 2 :(得分:0)

以为我会发布我想出的内容。 cbb是正在构建的数组。在错误的示例中,使用cbb逐步将abind构建为数组。在每个步骤中,必须重新评估cbb,因此每个连续步骤都较慢 - 一个不断增长的对象。在这个好例子中,cbb被构建为一个列表,并且每个步骤都声明了一个新的列表条目。 R不需要每次都重新评估现有列表。数组最后用do.call(abind, c(cbb, list(along = 4)))绑定在一起。

我觉得有用的一件事就是将cat(".")放在循环中。如果点打印速度变慢,则可能表示正在增长的对象。通过这个好例子,点以或多或少的恒定速率打印。好的例子比坏的快十倍。

BAD:

cbb <- array(NA, c(N1, N2, N3, 0))
repeat{ 
    sptsnew <- readBin(to.read, "integer", 2L, 4L)
    if(identical(sptsnew, integer(0))){cat("\nend of file\n"); break}
    ... #reading array metadata
    cbb <- abind(cbb, array(readBin(to.read, "double", N1*N2*N3, 4L), c(N1, N2, N3, 1)), along = 4)
    cat(".")
}

GOOD:

i <- 1
cbb <- list()
repeat{ 
    sptsnew <- readBin(to.read, "integer", 2L, 4L)
    if(identical(sptsnew, integer(0))){cat("\nend of file\n"); break}
    ... #reading array metadata
    cbb[[i]] <- array(readBin(to.read, "double", N1*N2*N3, 4L), c(N1, N2, N3, 1))
    i <- i + 1
    cat(".")
}
cbb <- do.call(abind, c(cbb, list(along = 4)))