Objekt ist NA

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
erje
Beiträge: 2
Registriert: So Apr 22, 2018 11:11 am

Objekt ist NA

Beitrag von erje » So Apr 22, 2018 11:31 am

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
 
    }
    

jogo
Beiträge: 932
Registriert: Fr Okt 07, 2016 8:25 am

Re: Objekt ist NA

Beitrag von jogo » So Apr 22, 2018 5:22 pm

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

erje
Beiträge: 2
Registriert: So Apr 22, 2018 11:11 am

Re: Objekt ist NA

Beitrag von erje » So Apr 22, 2018 10:08 pm

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.

jogo
Beiträge: 932
Registriert: Fr Okt 07, 2016 8:25 am

Re: Objekt ist NA

Beitrag von jogo » Mo Apr 23, 2018 8:26 am

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast