var newElement = '<div>' +
// ... more HTML ...
'</div>';
iElement.append( $compile(newElement)(scope) );
和sapply
(等)运行指定的次数。放replicate
将执行sapply(1:N, function(n){expr})
次N次。假设我想在m运行后停止expr
。这可能不会出错吗? sapply
不起作用,break
或for
循环在我的上下文中会太慢。
类似于:
while
除了休息不起作用。
我正在尝试做什么:
创建一个函数来读入定义结构但长度未知的大(二进制)数据文件。将sapply(1:N, function(n){
#some expression
if(identical(n, m)) break
})
与replicate
一起使用是我发现这样做的最好方法,但我希望它在array(readBin(...), ...)
开始返回时停止(即到达文件末尾)
答案 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)))