0 votes
in SoSci Survey (dt.) by s126035 (110 points)
edited by SoSci Survey

Liebes SoSci-Support-Team,

ich habe folgendes Anliegen.

In einer Befragung möchte ich, dass Teilnehmende sich ändernde aber ganz bestimmte Fragen präsentiert bekommen. Um festzulegen, welche Fragen präsentiert werden sollen, habe ich einen Algorithmus geschrieben. Hier wird dann auf einer Seite eine selbst geschriebene Funktion aufgerufen, die in einer Schleife festlegt, welche Fragen präsentiert werden und die Antwort der Person soll direkt weiter verarbeitet werden. Grobes Beispiel (das ganze ist ein Sortieralgorithmus):

function Funktion1(arg){
  while(Bedingung){
    $tmp = Funktion2(arg2);
  }
}

und

function Funktion2(arg2){
  while(true){
    if(Bedingung){
      $x = Wert1;
      $y = Wert2;
    
      ### Hier soll die Abfrage an die Person stattfinden ###
    
      if($x < $y){
        Mach etwas
      }else{
        mach etwwas anderes
      }
    }
  }
  return array($x, $y);
}

Ob $x < $y oder $x > $y soll die Person entscheiden über eine Rangfolgefrage, an der entsprechenden Stelle. Die Funktion in der die Abfrage steckt, steckt also in einem Loop.

Der Algorithmus ohne Abfrage durch eine Person funktioniert einwandfrei. Auch, dass im Teilfragebogen die Rangfolgefrage dann gewisse Vergleiche macht, bekomme ich hin. An der Zusammenführung scheitert es. Ich habe überlegt das mit einem Multil-Level-Design zu machen. Also dort wo ### Hier soll die Abfrage an die Person stattfinden ### steht, steht dann sowas wie:

    $a = array($x,$y);
    multiLevelDown('down', $a);
    $comp = multiLevelResponse();

"down" ist dann der Teilfragebogen, der nur die Rangfolgefrage enthält. Wenn ich das einsetze, funktioniert das aber nicht. Aktuell ist der gesamte Code auf einer Seite definiert.

Ich hoffe sehr, dass mir hier jemand weiterhelfen kann und freue mich über eine Rückmeldung.

Viele Grüße

1 Answer

0 votes
by SoSci Survey (305k points)

Aktuell ist der gesamte Code auf einer Seite definiert.

Das ist vermutlich das einzige Problem: Nach der Rückkehr aus dem untergeordneten Fragebogen setzt SoSci Survey auf der nächsten Seite fort. Ihr multiLevelResponse() wird also ausgeführt bevor der untergeordnete Fragebogen überhaupt geöffnet wurde.

Die "nächste Seite" kann auch die aktuelle Seite sein. Dann müssen Sie die Schleife aber mittels loopPage() programmieren, nicht mittels FOR oder WHILE.

Und nur nochmal zur Erklärung des technischen Hintergrunds: Wenn Sie multiLevelDown() verwenden, dann merkt sich SoSci Survey erstmal, dass es jetzt in einen anderen Fragebogen geht. Dann wird die aktuelle Seite fertig abgearbeitet. Und dann erst springt SoSci in den anderen Fragebogen. Wenn dort dann das multiLevelReturn() kommt, dann geht es im ursprünglichen Fragebogen weiter. Unter "weiter" heißt hier: Es geht genauso weiter als wäre der "Weiter"-Knopf gedrückt worden.

by s126035 (110 points)
Hallo,

das hat mir schonmal für das Verständnis des Multi-Level-Design sehr geholfen! Vielen Dank!

Mein Problem ist nun, dass ich nicht verstehe, wie ich die While-Schleife in Funktion2 zu einer loopPage() Schleife übertragen kann. Das Problem ist auch, dass die Anzahl der Wiederholungen alleine von der vorherigen Antwort der Person abhängt und damit unmöglich vorherzusagen ist. Könnten Sie mir da nochmal behilflich sein?

Viele Grüße
by SoSci Survey (305k points)
Eine Möglichkeit bestünde darin, dass Sie eine große Anzahl von Wiederholungen als Maximum festlegen - und bei erreichen des Abbruchkriteriums einfach mittels goToPage() aus dem Loop springen. Quasi ein while mit break.

Die Alternative besteht darin, dass Sie gar kein loopPage() verwenden, sondern auf der folgenden Seite einfach mittels goToPage() die Seite nochmal wiederholen, falls das Abbruchkriterium noch nicht erreicht ist.
by s126035 (110 points)
Den zweiten Weg habe ich auch schon versucht, dann bekomme ich aber die Fehlermeldung, dass die Seite bereits aufgerufen wurde.

"Dieses Interview versuchte, auf Seite Nr. 16 (Kennung XXX) zu springen, die bei der Ausgabe der aktuellen Darstellung bereits verarbeitet wurde. Bitte überprüfen Sie, ob goToPage() eine Schleife erzeugt."

Wenn das nur eine Warnung wäre, wäre mein Problem schon gelöst, weil ich die verschiedenen Schleifen auf unterschiedliche Seiten gepackt habe. So oder so wird Funktion1 Funktion 2 nämlich wieder aufrufen.
by SoSci Survey (305k points)
Wenn die Warnung gezeigt wird, dann springen Sie von Seite 16 auf Seite 16 - das gibt tatsächlich eine Endlosschleife.

Das goToPage() mit Ziel Seite 16 muss auf Seite 17 stehen. Wenn Sie das schon versucht haben, posten Sie hier doch bitte mal die Debug-Information, die zur Fehlermeldung angezeigt wird.
by s126035 (110 points)
Das goToPage(PMNify); (Seite 16) steht auf Seite 17.

Wenn ich die Debug informationen richtig verstehe, dann klappt das beim ersten mal, nicht aber beim zweiten mal. Die Zahlen im debug() sind die Seitenzahlen.

[Information]    Interview Nummer 305 wird fortgesetzt
[Information]    Der Fragebogen down im Projekt test281340 wird verwendet
[Information]    Die Verweildauer auf Seite 1 war 5 Sekunden
[Verarbeitung]    Lese Antworten von Seite 1
[Information]    Antwort auf R001_01 = 1
[Information]    Antwort auf R001_07 = 2
[Information]    Antwort auf R001 = 2
[Information]    Fragen bisher zu 100% vollständig beantwortet
[Verarbeitung]    Erstelle Seite 2 in Fragebogen down
[Information]    value("R001_1") = 1
[Information]    value("R001_7") = 2
debug()    Inhalt: value($v1) < value($v2) = true (boolean)
[Information]    value("R001_1") = 1
[Information]    value("R001_7") = 2
[Information]    Wechsel des Datensatzes: CASE 305 → CASE 304
[Information]    Interview Nummer 304 wird fortgesetzt
[Verarbeitung]    Erstelle Seite 17 in Fragebogen base
[Inhalt]    Erstelle Frage VP01
debug()    Inhalt: 17 = 17 (integer)
[Verarbeitung]    Springe zur Seite PMNify (Nr. 16)
[Verarbeitung]    Erstelle Seite 16 in Fragebogen base
debug()    Inhalt: 16 = 16 (integer)
[Verarbeitung]    Springe zur Seite Treeify3 (Nr. 15)
[Verarbeitung]    Erstelle Seite 15 in Fragebogen base
debug()    Inhalt: 15 = 15 (integer)
[Verarbeitung]    Springe zur Seite PMNify (Nr. 16)
[Verarbeitung]    Erstelle Seite 16 in Fragebogen base

Auf Seite 17 werden die Daten vom Teilfragebogen abgerufen, und verarbeitet. Dann wird auf Seite 16 zurückgeleitet. Das scheint beim ersten mal zu funktionieren. Auf Seite 16 wird die Schleife abgebrochen und auf Seite 15 zurückgeleitet. Nun sind auf Seite 15 die Bedingungen erfüllt, dass erneut Seite 16 aufgerufen werden soll. Da scheitert es anscheinend.

Für jeden Tipp bin ich sehr dankbar!
by SoSci Survey (305k points)
Wenn ich den Ablauf richtig interpretiere, passiert am Ende ein Sprung von Seite 15 auf Seite 16 - das dürfte wohl nicht passieren. Der nächste Schritt wäre also, dass Sie nachvollziehen, welcher Code auf Seite 15 den Sprung zur Seite 16 auslöst.
by s126035 (110 points)
Ok, leider ist der Sprung von mir gewünscht. Ich befürchte dann muss ich eine andere Lösung finden, es sei denn Sie hätten noch eine Idee dazu.

Vielen Dank auf jeden Fall für Ihre Mühe!!

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...