0

考虑以下代码

MyClass <- setRefClass("MyClass",

                          fields = list(body = "vector"),

                          methods = list(
                            initialize = function(length){
                              body <<- sample(-100:100, length) / 100
                            }
                          )
)

myFunction <- function(classA, classB){
    cut <- sample(1:length(classA$body), 1)
    new.bodyA <- c(classA$body[1:cut], classB$body[cut+1:length(classB$body)])
    new.bodyB <- c(classB$body[1:cut], classA$body[cut+1:length(classA$body)])
    classA$body <- new.bodyA
    classB$body <- new.bodyB
    return(list(classA, classB))
}

a <- MyClass$new(10)
b <- MyClass$new(10)

myFunction(a, b)

我想要实现的是两个新向量,它们根据随机元素索引组合两个给定向量的元素。

我不确定发生了什么,但是当我运行它时,新向量将包含 NA 值:

[[1]]
Reference class object of class "MyClass"
Field "body":
 [1]  0.50 -0.67  0.69 -0.43  0.12 -0.82  0.76  0.72 -0.02 -0.31    NA    NA    NA    NA    NA    NA    NA

[[2]]
Reference class object of class "MyClass"
Field "body":
 [1]  0.18  0.41  0.11  0.14  0.52 -0.67 -0.30 -0.85 -0.45  0.33    NA    NA    NA    NA    NA    NA    NA

我不确定为什么会发生这种情况 - 该功能正常工作,但我不知道如何避免 NA 值。有人可以解释为什么会这样,并提出解决方法吗?

非常感谢

4

2 回答 2

3

我很确定您的代码中的问题是当您使用

cut+1:length(classB$body)

而你应该使用:

(cut+1):length(classB$body)

这些不是一回事,因为:运算符的优先级高于二进制+(有关?Syntax运算符优先级的详细信息,请参阅)。你自己看:

2+1:6
# [1] 3 4 5 6 7 8
2+(1:6)
# [1] 3 4 5 6 7 8
(2+1):6
# [1] 3 4 5 6
于 2012-08-11T18:05:09.090 回答
1
 a = c(1,2,3,4,5)
 b = c(6,7,8,9,10)

 concat_a_wrong = c(a[1:3],b[3+1:length(b)])
 concat_a_correct  = c(a[1:3],b[(3+1):length(b)])



 >>concat_a_wrong 
 1  2  3  9 10 NA NA NA
 >>concat_a_correct  
 1  2  3  9 10

在错误的情况下,您将剪切添加到范围 1:length 中的每个项目,因此实际上您在 b 数组中超出边界(NA)

于 2012-08-11T18:13:06.377 回答