首页 > 解决方案 > R函数运行,什么都不执行(显然)

问题描述

我正在尝试使用函数根据向量中的 12 个元素之一将单个字母代码分配给数据源变量。这是向量:

> Grps
 [1] "ST"  "RW"  "LW"  "CF"  "CM"  "CDM" "CAM" "RM"  "LM"  "CB"  "RB"  "LB" 

这是函数:$PrimPos 为每一行保存 Grps 中的一个值,$PosGrp 是单字母代码(“F”、“M”或“D”)的目标。

AsgnPos <- function(j, b, e, pos) 
       {for(q in b:e)
           {if(CompleteDataset$PrimPos[j] == Grps[q]) 
           { CompleteDataset$PosGrp[j] <- pos}
       }
}

然后我循环遍历数据源(CompleteDataset),对函数运行三个测试以查看要分配的代码。(我意识到一旦我受到打击,我就可以打破常规,但现在它将遍历所有三个测试)。对函数,我传递: j...CompleteDataset 的行号// b...该类别的 Grps 的第一个位置// e...该类别的 Grps 的最后一个位置// pos...应用于 $PosGrp// 的字母代码

for(i in 1:17981) {
 if(CompleteDataset$PrimPos[i] == "GK") {
   CompleteDataset$PosGrp[i] <- "G"
 } else {
    AsgnPos(i,1,4, "F")
    AsgnPos(i,5,9, "M")
    AsgnPos(i,10,12, "D")
 }  

}

我预计 for 例程将执行 17,981 次,对数据源的每一行执行一次。第一部分工作正常——它将“G”应用于 $PosGrp,用于在 $PrimPos 中具有“GK”的任何行。我希望反过来,该函数将运行以检查当前行的 $PrimPos 是否与 Grps 向量的元素之一匹配。当它这样做时,它应该将字母代码分配给 $PosGrp。

代码执行时没有显式错误,但除了将“G”分配给所有匹配的行之外,它什么也不做。(我将 $PosGrp 字段默认为“Z”,除了那些更改为“G”的字段之外,它们仍然是“Z”。)

我已经尝试过调试,但我对此很陌生,即使我将它作为断点,我似乎也无法让它逐步执行该函数,所以我看不到那里发生了什么。但是我是否遗漏了一些明显的逻辑?

标签: rfunctionfor-loop

解决方案


这是一个范围问题。尝试对<<-函数之外的对象进行操作。

AsgnPos <- function(j, b, e, pos) {
    for(q in b:e){
        if(CompleteDataset$PrimPos[j] == Grps[q]){
            CompleteDataset$PosGrp[j] <<- pos
        }
    }
}

推荐阅读