問題は CurrentDay の入力方法にあると思います。以前は次のように作成されていました。
Transaction <- function(PnL, Day)
results <- list(a = PnL, b = Day)
return(results)
PnL と Day はどちらも数値です。
Day <- Transaction(PnL, Day)["b"]
ここで、Transaction はリストを返し、b は整数です。
moving_avg <- function(StockData, MA, CurrentDay){
#MA = Days long the MA is
#CurrentDay = What day we are currently on
MAValue <- NULL
total <- 0
start <- CurrentDay - MA
for(i in 1:length(MA)) {
total <- total + StockData[[start, 4]]
start <- start + 1
}
MAValue <- total/MA
return(MAValue)
}
なぜこのエラーが発生するのか知っている人はいますか?
CurrentDay のエラー - MA: バイナリ演算子の引数が数値ではありません
ベストアンサー1
あなたの質問はエラー メッセージに関するものであり、関数が達成しようとしていることに関するものではないため、エラーに対処します。
-
は、エラーが参照している「バイナリ演算子」であり、いずれかCurrentDay
またはMA
両方が数値ではありません。
二項演算は、2つの値(オペランド)を取り、別の値(詳細はWikipediaを参照) は+
そのような演算子の 1 つです。「1 + 1」は 2 つのオペランド (1 と 1) を受け取り、別の値 (2) を生成します。生成された値は必ずしもオペランドと異なるわけではないことに注意してください (例: 1 + 0 = 1)。
R は、数値引数に+
(および などの他の二項演算子)を適用する方法のみを認識します。-
> 1 + 1
[1] 2
> 1 + 'one'
Error in 1 + "one" : non-numeric argument to binary operator
このエラー メッセージが表示された場合、ユーザー (または呼び出している関数) が数値以外の何かに対してバイナリ演算を実行しようとしていることを意味します。
編集:
エラーは、[
の代わりにを使用していることにあります[[
。Day
はリストなので、 でサブセット化すると[
、数値ベクトルではなくリストが返されます。[[
ただし、 は、リストに含まれる項目のクラスのオブジェクトを返します。
> Day <- Transaction(1, 2)["b"]
> class(Day)
[1] "list"
> Day + 1
Error in Day + 1 : non-numeric argument to binary operator
> Day2 <- Transaction(1, 2)[["b"]]
> class(Day2)
[1] "numeric"
> Day2 + 1
[1] 3
Transaction
は、定義したとおり、2 つのベクトルのリストを返します。上記は、Day
1 つのベクトルを含むリストです。Day2
ただし、は単なるベクトルです。