Niet-numeriek argument voor binaire operatorfout in R

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 CurrentDayof 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 Dayeen 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 Dayeen lijst die één vector bevat. Day2is 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)
  }
}

Other episodes