对于基本R中的循环-双括号如何工作(并导致处理速度的提高)?

对于基本R中的循环-双括号如何工作(并导致处理速度的提高)?,r,performance,for-loop,R,Performance,For Loop,我一直在尝试为循环构建一个基本的R,我可以与其他R包函数一起加速测试 不幸的是,我在理解1)for循环必须如何构造,2)语法差异如何导致处理速度的显著变化,以及3)前两个问题是否有某种关联方面似乎存在差距。我所受的教育从未涉及到这些问题。我能找到的所有资源都不能解释实证结果 例如,让我们取一个种子的随机数据框,填充的值在1到5之间。所有大于4的值都将替换为零。对于具有不同括号结构的循环,我使用四种排列的,以便找到所有大于4的值,并用零替换它们。 其中三个完全用于循环,在使用了多少个双括号以及由此

我一直在尝试为循环构建一个基本的R
,我可以与其他R包函数一起加速测试

不幸的是,我在理解1)for循环必须如何构造,2)语法差异如何导致处理速度的显著变化,以及3)前两个问题是否有某种关联方面似乎存在差距。我所受的教育从未涉及到这些问题。我能找到的所有资源都不能解释实证结果

例如,让我们取一个种子的随机数据框,填充的值在1到5之间。所有大于4的值都将替换为零。对于具有不同括号结构的

循环,我使用四种排列的
,以便找到所有大于4的值,并用零替换它们。
其中三个完全用于循环,在使用了多少个双括号以及由此产生的速度增加之间,有一个有趣的关系

据我所知,这不是关于静默整数强制。 括号计数之间的速度差完全独立于它们是否以整数或双精度开始,或作为整数或双精度进行测试,或被替换为整数或双精度,以及上述所有组合。我对所有这些进行了测试,发现所有这些变化对最终速度的影响明显小于括号内的变化

为什么使用的括号数量会导致这些速度变化? 还有一个可能更简单的问题:为什么在“测试/过滤”向量中使用双括号的版本不起作用?-即使完全忽略它,或者在前面添加另一个双括号也会导致它起作用

请在下面找到我的示例代码:

set.seed(24)
# Numeric Dataframe
df_numeric_orig <- as.data.frame(matrix(sample(c(1:5), 1e6 *12, replace=TRUE),
                              dimnames = list(NULL, paste0("var", 1:12)), ncol=12))

## No Double Brackets
df_num <- df_numeric_orig
NumDF_NoSetsDbleBrackets <- 
system.time({
    for(row in 1:ncol(df_num)) {
        df_num[row][(df_num[row] > 4)] <- 0
    }
})

# 1 set Double Brackets - Front
df_num <- df_numeric_orig
NumDF_1SetDbleBrackets_front <- 
system.time({
    for(row in 1:ncol(df_num)) {
        df_num[[row]][(df_num[row] > 4)] <- 0
    }
})

# 1 set Double Brackets - Back
df_num <- df_numeric_orig
NumDF_1SetDbleBrackets_back <- 
system.time({
    for(row in 1:ncol(df_num)) {
        df_num[row][(df_num[[row]] > 4)] <- 0
    }
})

# 2 set Double Brackets 
df_num <- df_numeric_orig
NumDF_2SetDbleBrackets <- 
    system.time({
        for(row in 1:ncol(df_num)) {
            df_num[[row]][(df_num[[row]] > 4)] <- 0
        }
    })


NumDF_NoSetsDbleBrackets
NumDF_1SetDbleBrackets_front
NumDF_1SetDbleBrackets_back
NumDF_2SetDbleBrackets

为每个对象编制索引后,尝试对其使用
class
<代码>类(mtcars[1])
类(mtcars[[1]])
也许可以阅读本文来了解区别:我与Zelazny7讨论数据帧中固有的开销,而不是原子向量。另外,根本不运行的是因为
df_num[row]
返回一个单列数据帧。以同样的方式,使用单括号对其进行索引,试图选择另一个列集合。但是您只有一列,而您似乎认为
[df_num[[row]]>4]
将作为向量作用于其余的列。@MrFlick-Aha!看起来子集是我应该搜索的词。现在读起来。
The speed results on my machine typically come out about as below:
> NumDF_NoSetsDbleBrackets
   user  system elapsed 
   0.41    0.13    0.55 
> NumDF_1SetDbleBrackets_front
   user  system elapsed 
   0.25    0.10    0.35 
> NumDF_1SetDbleBrackets_back
Error: object 'NumDF_1SetDbleBrackets_back' not found
> NumDF_2SetDbleBrackets
   user  system elapsed 
   0.23    0.05    0.29