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)

私が達成しようとしているのは、ランダムな要素インデックスに基づいて、2 つの指定されたベクトルの要素を組み合わせた 2 つの新しいベクトルです。

何が起こっているのかわかりませんが、これを実行すると、新しいベクトルには 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 に答える