我无法理解这段代码在做什么。谁能解释一下吗? excelTbl[,(总和(`本期金额'), 总和(`比较期金额'), 总和(`%Change`), type=if(sum(`Current Period Amount`)-sum(`Comparison Period Amount`)=variancePer)& #(绝对值(V3)*100>=方差接受器)& (绝对值(V2-V1)>=varianceAmt*1000000) }否则{ ((绝对值(V2-V1)*100/绝对值(V2))>=variancePer)| #(绝对值(V3)*100>=方差接受器)| (绝对值(V2-V1)>=varianceAmt*1000000) }), 1:2]

我无法理解这段代码在做什么。谁能解释一下吗? excelTbl[,(总和(`本期金额'), 总和(`比较期金额'), 总和(`%Change`), type=if(sum(`Current Period Amount`)-sum(`Comparison Period Amount`)=variancePer)& #(绝对值(V3)*100>=方差接受器)& (绝对值(V2-V1)>=varianceAmt*1000000) }否则{ ((绝对值(V2-V1)*100/绝对值(V2))>=variancePer)| #(绝对值(V3)*100>=方差接受器)| (绝对值(V2-V1)>=varianceAmt*1000000) }), 1:2],r,data.table,R,Data.table,round(V1)!=0返回一个逻辑向量,只要表中有行。比如说, 1:5

round(V1)!=0
返回一个
逻辑
向量,只要表中有行。比如说,

1:5<3
#[1]正确-正确-错误-错误
  • …&圆形(V2)!=0
    是一个矢量化的“AND”,只要表中有行,它就仍然存在。比如说,

    (1:5<3)和(6:10<7)
    #[1]对错错错错
    
  • if(logicalOp==1)。。。否则…
    将根据
    logicalOp
    的值计算两个
    逻辑
    向量中的一个。如果它是1,那么它在逻辑上是“AND”,是从

    ((abs(V2-V1)*100/abs(V2))>=variancePer)&
    (绝对值(V2-V1)>=varianceAmt*1000000)
    
    否则,另一个向量

    这是与两个
    round
    逻辑向量的结果“和”相关的向量

    因为所有这些都在第一个逗号之前(在括号索引的
    i=
    组件中),所以它定义了要返回的行。如果只要有行,就有一个逻辑向量,那么
    TRUE
    的行将被保留,
    FALSE
    将被丢弃

    data.table
    中的许多内容就地运行时(引用语义,与R的常规写时复制语义相反),任何像这样对行进行子集的操作都将返回另一个
    data.table
    对象,而不会就地修改原始对象。因此,应该将此代码块的值捕获到一个新变量中

  • 逗号后,
    1:2
    选择前两列

    有趣的是,第一个括号块创建了一个包含六列的
    data.table
    ,分别命名为
    Class
    AccountSubType
    (使用
    by=
    定义的组)、
    V1
    V2
    V3
    type
    。但是,第二个括号块在筛选中仅引用
    V1
    V2
    ,然后丢弃除
    Class
    AccountSubType
    之外的所有内容,因此。。。看来没有必要计算

  • round(V1)!=0
    返回一个
    逻辑
    向量,只要表中有行。比如说,

    1:5<3
    #[1]正确-正确-错误-错误
    
  • …&圆形(V2)!=0
    是一个矢量化的“AND”,只要表中有行,它就仍然存在。比如说,

    (1:5<3)和(6:10<7)
    #[1]对错错错错
    
  • if(logicalOp==1)。。。否则…
    将根据
    logicalOp
    的值计算两个
    逻辑
    向量中的一个。如果它是1,那么它在逻辑上是“AND”,是从

    ((abs(V2-V1)*100/abs(V2))>=variancePer)&
    (绝对值(V2-V1)>=varianceAmt*1000000)
    
    否则,另一个向量

    这是与两个
    round
    逻辑向量的结果“和”相关的向量

    因为所有这些都在第一个逗号之前(在括号索引的
    i=
    组件中),所以它定义了要返回的行。如果只要有行,就有一个逻辑向量,那么
    TRUE
    的行将被保留,
    FALSE
    将被丢弃

    data.table
    中的许多内容就地运行时(引用语义,与R的常规写时复制语义相反),任何像这样对行进行子集的操作都将返回另一个
    data.table
    对象,而不会就地修改原始对象。因此,应该将此代码块的值捕获到一个新变量中

  • 逗号后,
    1:2
    选择前两列

    有趣的是,第一个括号块创建了一个包含六列的
    data.table
    ,分别命名为
    Class
    AccountSubType
    (使用
    by=
    定义的组)、
    V1
    V2
    V3
    type
    。但是,第二个括号块在筛选中仅引用
    V1
    V2
    ,然后丢弃除
    Class
    AccountSubType
    之外的所有内容,因此。。。看来没有必要计算


  • ,如果您可以更好地格式化代码(我已经为基本布局编辑了)。您不清楚这其中的哪部分?它是
    (某物)
    的基本
    数据表
    语法吗?
    by=.(…)
    ?您是否用括号将其拆分以查看每个步骤都在做什么?例如,只需运行
    excelTbl[,(sum…,by=(Class,AccountSubType)]
    ,将其存储在临时变量中,然后尝试下一批?@r2evans我无法理解第二对方括号在做什么。基本上,"by"之后的部分,
    excelTbl[, .(sum(`Current Period Amount`),
                   sum(`Comparison Period Amount`),
                   sum(`% Change`),
                   type = if (sum(`Current Period Amount`) - sum(`Comparison Period Amount`)< 0) "N" else "P"),
               by = .(Class, AccountSubType)][round(V1) != 0 &
                                                round(V2) != 0 &
                                                (if (logicalOp == 1) {
                                                  ((abs(V2 - V1) * 100 / abs(V2)) >= variancePer) &
                                                    #(abs(V3)*100 >= variancePer) &
                                                    (abs(V2 - V1) >= varianceAmt * 1000000)
                                                } else {
                                                  ((abs(V2 - V1) * 100 / abs(V2)) >= variancePer) |
                                                    #(abs(V3)*100 >= variancePer) |
                                                    (abs(V2 - V1) >= varianceAmt * 1000000)
                                                }), 1:2]