Seite 1 von 1

Objekt ist NA

Verfasst: So Apr 22, 2018 11:31 am
von erje
Hi,

bin R Anfänger und habe folgendes Problem, zu welchem ich keine Lösung gefunden habe:

Der Code ist eigentlich Teil eines größeren Codes und ich habe ihn weit möglichst reduziert und vereinfacht, um es lesbar zumachen und den Fehler zu finden. Anders kann ich das Problem auch nicht reproduzieren.

Es geht darum, einen Wert in einem Vektor s_werte in abhängigkeit von einer Iterationsvariable it zu setzen. Für it=2 wird ein Wert gesetzt. Danach möchte ich auf diesen Wert zugreifen, doch dieser ist NA. Wie ist das möglich?
In diesem Beispiel geht der Compiler für it=2 in die erste else-Klammer und setzt einen Wert für s_werte[it] <- s_neu. In der else-Klammer kann ich noch auf s_werte[it] zugreifen ( =16). Jedoch nach dieser else-Klammer ist s_werte[it] auf NA gesetzt.

Code: Alles auswählen


f <- function(x,y){x*y}
x<-10
y<-11
s <- 4
theta <- 4
iters<- 3

  x_werte <- c(x, rep.int(0, iters+1))
  y_werte <- c(y, rep.int(0, iters+1))
  s_werte <- c(s, rep.int(0, iters+1))
  
  
  it<-2
  
    a <- c(x_werte[it-1], y_werte[it-1])
    n <- c(x_werte[it-1], y_werte[it-1])
    z <- c(x_werte[it-1], y_werte[it-1])
    
    
    if( is.na(f(z[1],z[2]) < f(a[1],a[2])) ){
      s_neu <- s[it-1]
      s_werte[it] <- s_neu

      
    } else{
      
      s_neu <- s[it-1]*theta
      s_werte[it] <- s_neu

      
    }
     
     it <- 3 
     
    if( is.na(f(z[1],z[2]) < f(a[1],a[2])) ){
      s_neu <- s[it-1]
      s_werte[it] <- s_neu
      
    } else{
     
     s_neu <- s[it-1]*theta
     s_werte[it] <- s_neu
 
    }
    

Re: Objekt ist NA

Verfasst: So Apr 22, 2018 5:22 pm
von jogo
Hallo erje,

willkommen im Forum!
erje hat geschrieben: So Apr 22, 2018 11:31 am Der Code ist eigentlich Teil eines größeren Codes und ich habe ihn weit möglichst reduziert und vereinfacht, um es lesbar zumachen und den Fehler zu finden. Anders kann ich das Problem auch nicht reproduzieren.
Das ist eine gute Vorarbeit.
Es geht darum, einen Wert in einem Vektor s_werte in abhängigkeit von einer Iterationsvariable it zu setzen. Für it=2 wird ein Wert gesetzt. Danach möchte ich auf diesen Wert zugreifen, doch dieser ist NA. Wie ist das möglich?
In diesem Beispiel geht der Compiler für it=2 in die erste else-Klammer und setzt einen Wert für s_werte[it] <- s_neu. In der else-Klammer kann ich noch auf s_werte[it] zugreifen ( =16). Jedoch nach dieser else-Klammer ist s_werte[it] auf NA gesetzt.
Bei Deinem zweiten if (nachdem it <- 3 gesetzt wurde) geht es in den else-Zweig und dort steht:

Code: Alles auswählen

s_neu <- s[it-1]*theta
Das Objekt s hat immer noch den Wert 4 vom Anfang. Also ergibt sich:

Code: Alles auswählen

s <- 4
s[2] ### ergibt NA
noch eine Frage:
Warum definierst Du eine Funktion f(), die nichts anderes als eine Multiplikation ausführt?
Vielleicht ist die Funktion in Deinem kompletten Anwendungsfall etwas komplizierter, richtig?

Gruß, Jörg

Re: Objekt ist NA

Verfasst: So Apr 22, 2018 10:08 pm
von erje
Hallo Jogo, vielen Dank für deine Antwort. Genau das ist es. Anstatt

Code: Alles auswählen

s_neu <- s[it-1]*theta
sollte natürlich

Code: Alles auswählen

s_neu <- s_werte[it-1]*theta
hin. Und ich habe soo lange versucht den Fehler zu finden :D .
Eigentlich soll das ganze ein Optimierungsalgorithmus werden, der als Parameter unter anderem eine Funktion übergeben bekommt. Das Produkt benutze ich nur als Beispieleingabe.

Re: Objekt ist NA

Verfasst: Mo Apr 23, 2018 8:26 am
von jogo
Hallo erje,

auch an anderen Stellen in Deinem Skript steht

Code: Alles auswählen

... s[it-1]
Dort müsstest Du dann auch nochmal kontrollieren.

Gruß, Jörg