2017-05-03 2 views
1

Ich frage mich, wie ich den Code unten ändern kann, um die Funktion bis zu 7 mal zu wiederholen. Ich kann replicate(7, func(f)) nicht verwenden, da ich eine Funktion benötige, die mir eine Möglichkeit gibt, die Anzahl der Wiederholungen zu wählen. Ich meine, eine Funktion, die mich fragt, ob ich weitermachen will oder nicht.Eine definierte Funktion bis zu n mal wiederholen

annehmen

speed<-cars$speed 
dist<-cars$dist 
level<-c(1:50) 
f<-data.frame(speed,dist,level) 
plot(speed, dist, main="Milage vs. Car Weight", 
    xlab="Weight", ylab="Mileage", pch=18, col="blue") 
text(speed, dist, row.names(f), cex=0.6, pos=4, col="red") 

Das ist meine Funktion

func = function(A){ 
id.co1 <- identify(f$speed, f$dist,labels=row.names(f), n = 2, pos = TRUE,plot = TRUE) 
xy <- f[c(id.co1$ind[1],id.co1$ind[2]),] 
lines(xy, col="red", lwd=5) 
lm(dist~speed, xy) 
abline(coef(lm(dist~speed, xy)),col="blue") 
x.co1 <- f$speed[id.co1$ind[1]:id.co1$ind[2]] 
y.co1 <- f$dist[id.co1$ind[1]:id.co1$ind[2]] 
m.co1 <- lm(y.co1 ~ x.co1) 
} 
+0

Während es scheint, dass Sie ein reproduzierbares Beispiel haben, ist 'Autos' unbekannt. Probieren Sie es selbst in einem leeren R-Skript aus. – Parfait

+0

@Parfait, run require (stats); benötigen (Grafiken), dann haben Sie Zugriff auf Autos Datensatz. – Marco

+0

Bist du sicher? Diese sind Basispakete und sollten bereits verfügbar sein. Bitte aktualisieren Sie Ihren Code mit allen relevanten 'library' oder' require' Zeilen und Objektzuordnungen. Testen Sie die Reproduzierbarkeit in einer sauberen, neuen R-Umgebung. Sehen Sie dies häufig [zitierter Beitrag] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – Parfait

Antwort

1

wenn ich richtig verstehe, ist, Sie wollen oft angeben, wie die Ausführung einer Funktion zu wiederholen programmatisch interaktiv, nicht. Sie können dies tun, mit readline:

Ich brauche eine Funktion, die mir eine Möglichkeit gibt, die Anzahl der Wiederholungen

# some function 
funcA <- function(){ 
cat("i am funcA\n") 
} 
# some function that interactively repeats funcA a specified amount of times 
doNTimesA <- function() { 
    Ntimes <- readline("number of repeats: ") 
    for (i in 1:Ntimes) funcA() 
} 
doNTimesA() 

Ich meine, eine Funktion, die mich fragt, zu entscheiden, ob ich will oder nicht

funcB <- function(){ 
    while (TRUE) { 
    cat("i am funcB\n") 
    continue <- readline("again? y/n: ") 
    if (tolower(continue)=="n") break 
    } 
    cat("funcB is done") 
} 
funcB() 

bearbeiten, um fortzufahren: für Sie In einem speziellen Fall können Sie Ihre Funktionsdeklaration in eine while Schleife schreiben, die Sie fragt, ob Sie fortfahren möchten, wie in meinem Beispiel funcB oben. aktualisiert, wo es speichert auch seine Ausgabe:

func <- function(){ 
#initiate an iteration counter and an outputlist 
    counter <- 1 
    output <- list() 
#start an infinite loop 
    while (TRUE) { 
#do your thing  
    id.co1 <- identify(f$speed, f$dist,labels=row.names(f), n = 2, pos = TRUE,plot = TRUE) 
    xy <- f[c(id.co1$ind[1],id.co1$ind[2]),] 
    lines(xy, col="red", lwd=5) 
    lm(dist~speed, xy) 
    abline(coef(lm(dist~speed, xy)),col="blue") 
    x.co1 <- f$speed[id.co1$ind[1]:id.co1$ind[2]] 
    y.co1 <- f$dist[id.co1$ind[1]:id.co1$ind[2]] 
    m.co1 <- lm(y.co1 ~ x.co1) 
#store the result at counter index in the outputlist 
    output[[counter]] <- list(xco =x.co1, yco=y.co1, lm =m.co1) 
    counter <- counter+1 
#prompt for next iteration 
    continue <- readline("again? y/n: ") 
#break the loop if the answer is 'n' or 'N' 
    if (tolower(continue)=="n") break 

    } 
#return your output 
    output 
} 

Was das nach jeder Iteration jetzt geschieht, fragt die Funktion, wenn Sie die Funktion erneut ausführen wollen: continue <- readline("again? y/n: ") und prüft, ob Sie N oder n beantwortet haben. Sie können weitere Prüfungen der Antwort hinzufügen, wenn Sie möchten; Wenn Sie jetzt nichts außer N oder n beantworten, wird die Schleife erneut ausgeführt.

Wenn Sie laufen all <- func(), nachdem Sie Sie fertig sind kann Ergebnis jeweils Iterationen zugreifen all[[1]] verwenden, all[[2]] usw.

Bitte beachten Sie, dass es in der Regel verpönt Objekte außerhalb des Funktions Umwelt zu manipulieren, so würde es Seien Sie sauberer, um die ursprüngliche Plotgenerierung in Ihre Funktion zu übernehmen.

+0

Vielen Dank für Ihre Hilfe, ich bin ein wenig verwirrt über diese Lösung. Ich möchte auswählen verschiedene Intervalle (Punkte) per Mausklick.Was ich will ist nach der Auswahl jeweils zwei Punkte und verbinden sie durch eine gerade Linie, das System fragte mich, ob ich weitermachen und ein anderes Paar von Punkten wählen möchte. Wenn ich ja sage, dann könnte ich noch zwei weitere Punkte auswählen und wenn ich nicht sage, würde mir das System den Wert meiner letzten zwei Auswahl geben. – Marco

+0

Func ist eine Funktion, die ich gemacht habe und Ich möchte es basierend auf der Anzahl der Zeiten wiederholen, die ich will (durch Beantworten Ja oder nicht, ob ich fortfahren möchte oder nicht) – Marco

+0

das kleine Beispiel ist zu zeigen, wie man vorgeht Hinzufügen einer Option "Möchten Sie fortfahren" zu einer Funktion oder Hinzufügen einer Option "Ich möchte angeben, wie oft ich dies tun möchte". –

Verwandte Themen