2017-05-06 9 views
0

Ich schreibe eine Funktion, die die Dauer einzelner Laute in einer Liste von Audiodateien misst. Ich brauche diese Anrufdauer, um als nummerische Listen gespeichert zu werden, die durch Datei organisiert werden. Wenn ich meine Funktion zum Drucken der Aufgabe schreibe, druckt sie die Listen so, wie ich sie möchte, speichert sie aber nicht in einer externen Variablen. Wenn ich jedoch die Druckfunktion verlasse, werden alle Anrufe in einer Liste gespeichert, ohne anzugeben, aus welcher Datei sie stammen. Irgendwelche Ideen? Vielen Dank.Druckausgabe als numerische Liste in R speichern?

Input:

callduration2 <- function(x) { 
    for (i in x) { 
     print(timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.end - timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.start) 
    } 
} 

Output:

[1] 0.1035461 4.1581914 1.4687190 
[1] 0.2317160 0.3616587 0.3316719 0.2598854 0.2117248 0.2162683 0.1635642 1.0295460 
[1] 0.1035461 4.1581914 1.4687190 
[1] 0.2283603 0.1571119 0.1023054 
[1] 0.2795895 0.2531787 
[1] 0.7232425 1.0376167 0.5624210 0.1235691 0.3389063 

OR

Input:

callduration <- function(x) { 
    output9 <- list() 
    for (i in x) { 
    i.t <- timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE) 
    output9 <- append(output9, i.t$s.end - i.t$s.start) 
    } 
    output9 
} 

Output:

[[1]] 
[1] 0.1035461 

[[2]] 
[1] 4.158191 

[[3]] 
[1] 1.468719 

[[4]] 
[1] 0.231716 

[[5]] 
[1] 0.3616587 

[[6]] 
[1] 0.3316719 

[[7]] 
[1] 0.2598854 

[[8]] 
[1] 0.2117248 

[[9]] 
[1] 0.2162683 

[[10]] 
[1] 0.1635642 

[[11]] 
[1] 1.029546 

[[12]] 
[1] 0.1035461 

[[13]] 
[1] 4.158191 

[[14]] 
[1] 1.468719 

[[15]] 
[1] 0.2283603 

[[16]] 
[1] 0.1571119 

[[17]] 
[1] 0.1023054 

[[18]] 
[1] 0.2795895 

[[19]] 
[1] 0.2531787 

[[20]] 
[1] 0.7232425 

[[21]] 
[1] 1.037617 

[[22]] 
[1] 0.562421 

[[23]] 
[1] 0.1235691 

[[24]] 
[1] 0.3389063 
+3

Wie sehen Ihre Eingabedaten aus? Woher kommt "timer" und ist es vektorisiert? Sie müssen [um Ihr Beispiel reproduzierbar zu machen] bearbeiten (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#5963610). Allgemeiner ausgedrückt, ist "lapply" mehr nützlich als eine "for" -Schleife, da Sie Ihr Ergebnis beliebig strukturieren können. – alistaire

+0

Hallo Willkommen zu SO. Ich verstehe nicht genau, was du mit speichern hier meinst. Können Sie näher beschreiben, wie Sie die Dateien lesen? – DJJ

+0

Um ein wenig auf @alistaire guten Vorschlag etwas wie 'lapply (x, Timer, Schwelle = 2, msmooth = c (400,90), dmin = 0,1, Plot = FALSE) erweitern' wird eine Liste zurückgeben. Dies wird Timer aufrufen, für jedes Element von x die zusätzlichen Parameter (nicht getestet) übergeben – epi99

Antwort

0

Ich schieße im Dunkeln. Meine Vermutung wäre diese. Denken Sie daran, dass in einer Funktion das letzte Objekt zurückgegeben wird. Sie können es auch mit dem Befehl return angeben, wenn Sie möchten. In Ihrem ersten Code haben Sie x durchlaufen, die Ergebnisse jedoch nicht gespeichert und der Funktion mitgeteilt, etwas auszugeben.

In Ihrem zweiten Code speichern Sie die Ergebnisse in einer Liste und zurück, aber ich weiß nicht genau, welche Art von Ausgang Sie suchen.

callduration2 <- function(x) { res <- matrix(nrow=length(x)) for (i in x) { res[i] <- timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.end - timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.start } return(res) }

myresults <- callduration2(x)

Um zu vermeiden, die Schleife Schreiben Sie Folgendes tun könnte.

sapply(x,function(i) timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.end - timer(i, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE)$s.start)

0

Vielleicht könnte man so etwas schreiben: Dauer eine Funktion ist, die Dauer zu messen, und was die callduration zurückkehrt ist ein Vektor der Dauern, das gleiche wie die Parameter zu callduration mit Namen.

duration <- function(x) { 
    t <- timer(x, threshold = 2, msmooth = c(400,90), dmin = 0.1, plot = FALSE) 
    t$s.end - t$s.start 
} 

callduration <- function(xs) { 
    durations <- sapply(xs, duration) 
    names(durations) <- names(xs) 
    durations 
} 
+0

Das hat perfekt funktioniert! Ich danke dir sehr!! –