Rでステートマシンをコーディングするためのよりマトリックス/適用指向の方法と、forループと一連のifステートメントでここで行ったことを探していますか? これは、マシンの以前の状態を知る必要がある R で可能ですか?
次のマシンは、A1 と A2 が両方とも 1 の場合にアームされ、B1 と B2 が両方とも 1 の場合にアームが解除されます。一般に、A1、A2、B1 と B1 の間に既知の関係はありません。どの条件も満たされない場合は、以前の状態が維持されます。
for ループが行列を 1 つずつステップ実行せずに、R でこの種の計算を行うことは可能ですか? もしそうなら、S1a を計算するコードを作成してください。ありがとう。
[[少し簡略化するために編集]]
Mach1 = matrix(data=0, nrow = 24, ncol = 6)
colnames(Mach1)=c("A1","A2","B1","B2","S1","S1a")
Mach1[,"A1"] <- c(0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0)
Mach1[,"A2"] <- c(0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0)
Mach1[,"B1"] <- c(0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0)
Mach1[,"B2"] <- c(0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1)
for (i in 2:nrow(Mach1)){
Prev = Mach1[(i-1),"S1"]
Prev = ifelse(is.na(Prev), 0, Prev)
Arm = ((Mach1[i,"A1"] ==1) && (Mach1[i,"A2"] == 1))
Disarm = ((Mach1[i,"B1"] == 1) && (Mach1[i,"B2"] == 1))
if ((Prev == 0) && (Arm)){ #Turn on
Mach1[i,"S1"] <- 1
print(paste(i, "Armed"))
} else if ((Prev == 1) && (Disarm)){ #Turn off
Mach1[i,"S1"] <- 0
print(paste(i, "Disarmed"))
} else {
Mach1[i,"S1"] <- Prev
print(paste(i, "---"))
}
}
rm(Arm, Disarm, Prev, i)