连接的R向量中的NA值

时间:2012-08-11 17:57:44

标签: r vector concatenation

考虑以下代码

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值。有人可以解释为什么会这样,并提出一个解决方法吗?

非常感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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:长度中的每个项目 所以实际上你在b数组中出去了(NA)