考虑以下代码
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值。有人可以解释为什么会这样,并提出一个解决方法吗?
非常感谢
答案 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)