Het probleem dat ik geloof is hoe de huidige dag is ingevoerd. Het is eerder gemaakt als:
Transaction <- function(PnL, Day)
results <- list(a = PnL, b = Day)
return(results)
Beide PNL en dag zijn numerieke waarden.
Day <- Transaction(PnL, Day)["b"]
waar transactie een lijst en b heeft geretourneerd, is een geheel getal.
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)
}
Iedereen weet waarom ik deze fout ontvang?
Fout in de huidige dag – MA: niet-numeriek argument voor binaire operator
Antwoord 1, Autoriteit 100%
Omdat uw vraag wordt geformuleerd met betrekking tot uw foutbericht en niet wat uw functie probeert te bereiken, zal ik de fout aanpakken.
-
is de ‘binaire operator’ die uw fout verwijst, en ofwel CurrentDay
of MA
(of beide) zijn niet-numeriek.
Een binaire bediening is een berekening die twee waarden (operands) kost en een andere waarde produceert (zie Wikipedia voor meer ). +
is een dergelijke operator: “1 + 1” neemt twee operanden (1 en 1) en produceert een andere waarde (2). Merk op dat de geproduceerde waarde niet noodzakelijkerwijs anders is dan de operanden (bijvoorbeeld 1 + 0 = 1).
R weet alleen hoe +
(en andere binaire operatoren, zoals -
) op numerieke argumenten moet worden toegepast:
> 1 + 1
[1] 2
> 1 + 'one'
Error in 1 + "one" : non-numeric argument to binary operator
Als je die foutmelding ziet, betekent dit dat je (of de functie die je aanroept is) een binaire bewerking probeert uit te voeren met iets dat geen nummer is.
BEWERKEN:
Uw fout zit in het gebruik van [
in plaats van [[
. Omdat Day
een lijst is, levert subinstelling met [
een lijst op, geen numerieke vector. [[
geeft echter een object terug van de klasse van het item in de lijst:
> 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
, zoals u het heeft gedefinieerd, geeft een lijst met twee vectoren terug. Hierboven is Day
een lijst die één vector bevat. Day2
is echter gewoon een vector.
Antwoord 2
Als je dit vóór je code uitvoert, komt alles goed.
'+' <- function(e1, e2) {
if (is.character(e1) | is.character(e2)) {
paste0(e1, e2)
} else {
base::`+`(e1, e2)
}
}