是否可以在R
中监控矢量化操作的进度?例如。在循环中,可以始终if (i %% 10000) print(i)
查看代码当前正在处理的元素。我的直觉是,#34;可能不是",但可能是我错了?
答案 0 :(得分:4)
在我的评论中,我询问了您的代码是什么以及如何实现矢量化。我觉得这很重要。虽然一般来说,矢量化是通过在编译代码中使用循环来实现的,但我并不完全确定。因此,我不太自信地说'#34;绝对没有"。
但是,如果要跟踪R级别的进度,则必须能够获得索引,例如在R级i
循环中使用的for
。现在,让我们检查大多数R矢量化函数的样子:
> grep
function (pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,
fixed = FALSE, useBytes = FALSE, invert = FALSE)
{
if (!is.character(x))
x <- structure(as.character(x), names = names(x))
.Internal(grep(as.character(pattern), x, ignore.case, value,
perl, fixed, useBytes, invert))
}
<bytecode: 0xa34dfe0>
<environment: namespace:base>
> gsub
function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
{
if (!is.character(x))
x <- as.character(x)
.Internal(gsub(as.character(pattern), as.character(replacement),
x, ignore.case, perl, fixed, useBytes))
}
在上面的例子中,我们看到那些向量化的R函数只是编译代码的一个薄包装器(参见.Internal()
)。没有明确的循环索引供您参考。因此,对于这些示例功能,跟踪进度是不可能的。
我建议您查看您使用的特定功能。这是说服自己的最佳方式。
跟进
最初,我在我的示例中添加了lapply
:
> lapply
function (X, FUN, ...)
{
FUN <- match.fun(FUN)
if (!is.vector(X) || is.object(X))
X <- as.list(X)
.Internal(lapply(X, FUN))
}
<bytecode: 0x9c5c464>
<environment: namespace:base>
然后@RichardScriven表达了他对*apply
家庭的看法。在堆栈溢出时,这两个帖子/答案对于理解R中的向量化问题非常有用:
但是,虽然lapply
调用C代码来执行循环,但它必须在循环中评估R函数FUN
。因此:
FUN
占据执行时间,那么lapply
将不会比R for
循环具有明显的优势。FUN
做得很少,那么循环开销在执行中占主导地位,那么lapply
将比R for
循环有明显的优势,因为{{1} C中的循环更多&#34;轻量级&#34;。在这篇文章中讨论for
的性能是偏离主题的,所以我不会附上演示示例。