2016-11-16 3 views
1

Erstens, mein Englisch ist nicht so richtig, so entschuldige ich mich im Voraus für alle Grammatikfehler/Fehler in meiner Frage.Ergebnis einer Liste von Funktionen zurückgeben mit Return()

Ich habe diese allgemeine Funktion:

.my_funfun <- .my_fun(x,y,...) 

und mit ".my_funfun" als Code Starter gegeben, die args von "my_fun"

:

.my_fun <- function(x,y,...){ 
     <body> 
     return(
       list(
        fun1 <- function(x){ 
          <bodyfun1> 
         }, 
        fun2 <- function(y){ 
          <bodyfun2> 
         }, .... 
       ) 
      ) 
} 

als Hilfs der verwendet werden

Ich muss Werte in der angegebenen Reihenfolge zurückgeben und natürlich das Ergebnis der Funktionen zurückgeben, die im Text der Liste enthalten sind. Normalerweise würde ich die Funktionen separat verarbeiten, die Ergebnisse in separaten Objekten speichern und die Werte dieser Objekte in eine Liste einfügen und diese Liste zurückgeben (einfachste Methode), aber ich muss die Struktur beibehalten, die ich zuvor gezeigt habe .

Meine Frage ist: Gibt es eine Möglichkeit, die Funktionen im Körper der Liste zu lösen und diese Werte unter Beibehaltung der gegebenen Struktur zurückzugeben? Oder ist es unmöglich, auf diese Weise zurückzukehren? Ich habe return() als vorzeitigen Funktionsstopper und als ausgefallenen Drucker für Objekte in Kontrollstrukturen verwendet, aber diese Verwendung ist neu für mich.

Wenn Sie die spezifischen Codeelemente benötigen, die ich ihnen zur Verfügung stellen kann.

Vielen Dank im Voraus.

+1

Spezifische Codeelemente mit einem Arbeits Beispiel und gewünschte Ausgabe wird definitiv helfen –

+0

Danke Pierre, ich habe bereits die Antwort gefunden. –

Antwort

0

Ok, mache Sachen herum, ich erkannte, was mein Fehler auf dem Code war. Die Sache ist, dass, wenn ich rufe

myfun$fun1 

Ich habe keine Antwort. Der richtige Weg, um die Liste zu machen, ist

.my_fun <- function(x,y,...){ 
    <body> 
    return(
     list(
      fun1 = function(x){ 
        <bodyfun1> 
        }, 
      fun2 = function(y){ 
        <bodyfun2> 
        }, .... 
      ) 
     ) 
} 

So kann ich die "fun1, fun2 Namen verwenden (...) als Name in axiliary function.s

Beispiel zu nennen: Ich möchte machen eine lineare kongruente Zufallsgenerator, mit dem folgenden Code:

.rCongLin <- function(a, c, m, x0){ 
    v1 <- x0 
    return(
      list(seed=function(xw){ 
          v1 <- xw}, 
        nxt=function(){ 
          v2 <- ((a*v1)+c)%%m 
          v3 <- v2/m 
          v1<<-v2 
          return(v3) 
        }, 
        shw=function(){ 
          return(list(a=a,c=c,m=m,x0=x0))} 
      ) 
    ) 
} 

die Anweisung:

.rCL <- .rCongLin(51864,35186,4153,1515) 

beginnt die Anzahl ge ration gegeben, um die Funktion:

rCL=function(n){ 
     replicate(n,.rCL$nxt())} 
rCL(45) 

wo seed() Neustarts X0, nxt() die Zahlen berechnet und shw() zeigt den internen Zustand (Werte für die Berechnung). rCL(n) gibt n Anzahl der Replikate zurück.

Die Sache ist die, dass .rCL$x() (wo x() ist jeder Spaß der Genannten) nichts zurück, wenn Sie ‚< -‘ verwenden Operator (es ändern, so u haben eine Demonstration dessen, was im reden), aber es zurückkehrt, mit " = '.

Die Antwort ist, dass die Funktionen mit '=' arbeiten, weil Namen auf den Listen mit '=' zugewiesen werden (u Dinge in Listen mit '=') und nicht mit '< -'. Um also die Funktionen "citable" im Körper der return(list(fun1, fun2...) zu machen, müssen Sie die Namen fun1, fun2... mit '=' vergeben.

Es war eine einfache Antwort. Verwechselte die Verwendung von '=' und '< -', da im ursprünglichen Code jede Zuweisung mit '=' erfolgt. Sein anfällig Roman Programmierer wie mich zu verwirren :(

Vielen Dank für Ihre Hilfe! Wieder Es tut mir leid für alle gramatical Fehler in dieser Antwort. Ich hoffe, das mehr Menschen hilft.

1

Bitte versuchen Sie ein reproduzierbares Beispiel hinzuzufügen, damit andere Ihnen helfen können.

Anyways, wenn ich deine Frage richtig erhielt. Dann könntest du das tun.

my_fun <- function(x,y) { 
    fun1 <- function(x) { 
     length(x) 
    } 
    fun2 <- function(y) { 
     sum(y) 
    } 
    list(fun1(x),fun2(y)) 
} 
Verwandte Themen