2015-04-16 9 views
18

Kwestia, w którą wierzę, to jak wpisano CurrentDay. Poprzednio został utworzony jako:Nieliczbowy argument na binarny błąd operatora w R

Transaction <- function(PnL, Day) 
    results <- list(a = PnL, b = Day) 
    return(results) 

Zarówno PnL, jak i Day są wartościami liczbowymi.

Day <- Transaction(PnL, Day)["b"] 

Gdzie transakcja zwróciła listę, a b jest liczbą całkowitą.

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) 
} 

Ktoś wie, dlaczego otrzymuję ten błąd?

Błąd w CURRENTDAY - MA: Argument nienumeryczny do binarnego operatora

+1

Proszę podać przykładowe dane i pokazać, w jaki sposób wywołuje się tę funkcję. Zobacz [jak utworzyć powtarzalny przykład] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – MrFlick

+0

Funkcja jest ok. Prawdopodobnie nazwałeś ją argumentem nieliczbowym. Podaj powtarzalną próbkę, na przykład @MrFlick. – smci

+0

Myślę, że znalazłem problem, CurrentDay jest przypisany do zmiennej, którą wyznaczyłem z listy. Kiedy po prostu wydrukuję CurrentDay, dostaję $ b [1] 41 – BenLar

Odpowiedz

34

Ponieważ pytanie jest sformułowane w sprawie komunikatu o błędzie i nie niezależnie funkcja stara się osiągnąć, zajmę się błąd.

- jest „operator binarny” Twój błąd jest przedstawieniu i albo CurrentDay lub MA (lub oba) są non-numeryczne.

Operacja binarna to obliczenie, które pobiera dwie wartości (operandy) i tworzy inną wartość (see wikipedia for more). + jest jednym z takich operatorów: "1 + 1" pobiera dwa operandy (1 i 1) i tworzy inną wartość (2). Należy zauważyć, że wytworzona wartość niekoniecznie różni się od argumentów (np. 1 + 0 = 1).

R tylko wie, jak stosować + (i innych operatorów binarnych, takich jak -) do numeryczne argumenty

> 1 + 1 
[1] 2 
> 1 + 'one' 
Error in 1 + "one" : non-numeric argument to binary operator 

gdy widzisz, że komunikat o błędzie, oznacza to, że jesteś (lub funkcję” ponowne wywołanie to) próba wykonania operacji binarnej z czymś, co nie jest liczbą.

EDIT:

Twój błąd polega na wykorzystaniu [ zamiast [[. Ponieważ Day jest listą, podzestaw z [ zwróci listę, a nie wektor liczbowy. [[ jednak zwraca obiekt klasy elementu zawartego w liście:

> 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, jak już określono go, zwraca listę dwóch wektorów. Powyżej, Day jest lista zawiera jeden wektor. Day2 jest jednak po prostu wektorem.

+0

patrząc na mój kod, czy moja zmienna Day nie jest wartością numeryczną w oparciu o pierwotnie ustawiony na początku? Jeśli nie, co muszę zrobić, aby to zrobić? – BenLar

+0

to pomaga? – BenLar

+2

@BenLar zobacz zaktualizowaną odpowiedź –

Powiązane problemy