Programmierfunktionen (oder Funktionen, die Funktionen generieren)Ich habe ein Problem, bei dem die Lösung, die ich möchte, darin besteht, eine Funktion zum Generieren einer anderen Funktion zu verwenden. Hier ist ein Spielzeugbeispiel. Ich erwarte, dass es [3,4,5] zurückgibt. Es funktioniert nicht wie erhofft, da das übergebene Argument (Offset) der zurückgegebenen anonymen Funktion offenbar nicht zur Verfügung steht. Ich vermute, dass es eine Möglichkeit gibt, dies durch Substitution zu erreichen, aber ich konnte es nicht herausfinden.
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));Erweiterte statistische ModellierungVersuchsplanungQualitäts- und VerfahrenstechnikBetreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Tut mir leid, dass ich hier doppelt poste, aber es gibt tatsächlich eine bessere Möglichkeit, die nur eine Änderung der Funktionalität erfordert:
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Eval( Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
) )
);
funWrapper([1,2,3], funFUnctional(2));Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)@SDF1 Ich versuche den Wert des Parameters zu finden, bei dem die Funktion Null ist, ähnlich wie Uniroot Funktion in R. Mir ist keine ähnliche JMP-Funktion bekannt. Auf jeden Fall habe ich den Code dafür gestohlen, also war es ganz einfach 
Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Bitte beachten Sie, dass JMP14-Klassen nicht voll funktionsfähig sind und Sie möglicherweise verbrannt werden, wenn Sie sich zu sehr auf sie verlassen. In JMP12+ können Sie jedoch Klassen (einschließlich Vererbung, Konstruktoren, Destruktoren usw.) mit Namespaces und etwas Metaprogrammierung erstellen.
Um die erste Frage des OP zu beantworten – Sie können Ihr Ziel mit nur minimalen Änderungen an Ihrem Skript erreichen – beachten Sie einfach, dass der Rückgabewert einer JSL-Funktion ausgewertet wird (mit der Eval()-Anweisung), bevor er zurückgegeben wird.Wenn Ihre letzte Anweisung also ein nicht ausgewerteter Ausdruck ist (z. B. ein Expr( Function( _definition_ ) ), dann wird die Funktion wie beabsichtigt zurückgegeben.Nur ein kleiner Trick in der zweiten Funktion ist nötig, um die Funktion aufrufen zu können (die „fun = fun“-Anweisung).
funWrapper = Function({array, fun},
fun = fun;
fun(array);
);
funFunctional = Function({offset},
Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
)
);
funWrapper([1,2,3], funFUnctional(2));Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Hallo @Mittman ,
Es hört sich so an, als würden Sie versuchen, nach den Wurzeln einer Gleichung (in diesem Fall einer Funktion, nicht JSL Function()) zu suchen. Ist das richtig?
Es gibt eine integrierte JSL-Funktion namens Minimize(), an die Sie Ihre Funktion mit Startpunkten für die Minimize()-Funktion übergeben können, um ihre Optimierungsroutine zu starten. Dies könnte ein einfacherer Weg sein, als dafür eine eigene JSL Function() zu schreiben. Sie können einen Blogbeitrag darüber lesen Hier .
Hoffentlich hilft das!,
DS
Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Hallo @SDF1 , danke für die Antwort. Dies funktioniert jedoch nicht für meinen realen Anwendungsfall. Ich möchte in der Lage sein, eine beliebige (monotone) Funktion als Argument an eine Funktion zu übergeben, die die Nullstelle findet. Das ist ganz einfach, wenn ich jede Funktion explizit definiere, aber ich bin auf Probleme gestoßen, als ich eine Funktion zum Erstellen einer Instanz einer Funktion aus einer parametrisierten Klasse schreiben wollte. Ich bin in R aufgewachsen, was nicht wirklich OO ist, aber die Scoping-Regeln erlauben Code wie den, den ich im ursprünglichen Beitrag hatte.
- EM
Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Hallo @Mittman ,
Ich bin mir nicht sicher, ob das genau das ist, was Sie wollen, aber es funktioniert, um zumindest das Beispiel zu lösen, das Sie in Ihrem ursprünglichen Beitrag angegeben haben.
Names Default to Here (1);
fWrap = Function({array, offset}, fFun(array offset));
fFun = Function({x, offset}, x + offset);
fWrap([3, 4, 5, 6], 5 );Dies wird [8, 9, 10, 11] zurückgeben.
Es ist ein interessantes Thema, das man sich ansehen kann. Wenn Sie mir mitteilen können, warum Sie es auf diese Weise tun müssten, bin ich ziemlich neugierig.
Hoffe das hilft!,
DS
Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Vielen Dank für das Teilen dieser aufschlussreichen Vignetten, Craige.
Hier finden Sie Lösungen, die beide Ansätze nutzen. Klassen fühlen sich für mich intuitiver an (und „dies“ ist sicherlich einfacher einzugeben als namespace(expr(ns<
Getestet sowohl im JMP 14 Pro als auch im JMP 12 Pro. Kurse sind in JMP 12 Pro nicht verfügbar.
funOffsetAdder = Function({offset},
ns = NewNamespace();
ns:offset = offset;
ns:theMethod = EvalExpr(
Function({x},
this = namespace(expr(ns<<GETNAME></GETNAME>Betreff: Funktionen programmieren (oder Funktionen, die Funktionen generieren)Ich habe einige Experimente durchgeführt: So verwenden Sie „Klasse definieren“. Und Funktionale Programmierung mit JSL-Objekten
Schreiben Sie uns zurück, wenn Sie mehr über das Rätsel herausgefunden haben. An dieser Stelle verwende ich die JSL-Klassen nicht oft, aber sie sind möglicherweise die beste Möglichkeit, das zu tun, was Sie wollen. Namespaces können äquivalent sein, ohne einige der Unterklassenideen. Mit beiden können Sie eine Funktion und Daten zusammenpacken und das Paket per Referenz an eine andere Funktion übergeben.