Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Supported by

[solved] Using form_multiple_choice: how to log answers of 8 questions in a row?

floflo
edited November 2015 in OpenSesame

Hi,

I am working on a short questionnaire using form_multiple_choice. I have 8 MC questions with four answer options each (of which only one is correct). I want them all to appear one after the other and then provide a feedback screen afterwards that indicates the score.

I have built a small test experiment with three questions. I don't quite understand how the responses on the form_multiple_choice need to be logged and how I indicate which of the options is correct. I have now put together this:

Do I need a logger after each form_multiple_choice or is that overkill? How else can I keep track of the responses to the questions? Any pointers would be greatly appreciated. :)

Thank you for your time and have a nice day!

  • Florian

Comments

  • edited 12:57AM

    Hi Florian,

    How about you use a loop? In this sense, in each iteration you run your form once with one of the questions, log the response (with a logger) and then proceed with the next iteration. Once, all the questions are answered, you can leave the loop and present the feedback. Depending on what the feedback is supposed to look like, you might have to add some extra book keeping in an inline_script (accessing current response and store them permanently in another variable).
    In the loop_table of the loop, you'll have to set the question and the answers as variables.

    Does this help you?

    Eduard

  • floflo
    edited November 2015

    Hi Eduard,

    thanks, that got me at least two steps further!

    I now have a loop with a couple of variables (question_text, answer_option_[1 through 4], and correct_response (indicating which of the options [1 through 4] is correct).

    So now I have this structure:
    EDIT: I just realized that the formatting of the code block below was completely messed up. Fixed it now.

    main_loop
        sequence
            form_multiple_choice
            inline_script
            logger
        feedback
    

    When I run the experiment, all questions are shown - yay!

    However, I don't understand how to log the responses and/or access them in the inline_script. According to this part in the documentation I should be able to access them using var.variable_name. In the form_multiple_choice, I indicate that the "response variable" is response. In the inline_script, however, neither print(response) nor print(var.response) seem to work (both give me the error that they are "not defined").

    What does seem to work is using print(self.get("response")) (as suggested in this part of the documentation). This prints the text of the answer option, though. Is there a way to get the index of the option?

    Thanks!

    • Florian
  • edited 12:57AM

    First of all, which OpenSesame are you using? Accessing variables via var.<varname> was only introduced in Opensesame 3.0. For all older versions, you'd have to do something like this:

    var = exp.get('varname')
    # do stuff with var
    exp.set('newvar', newvar)
    

    There are some ways how to retrieve the index. The most straightforward one is this, I think

    resp = self.get('response')
    if resp == exp.get('answer_option_1':
         respI = 1
    elif resp == exp.get('answer_option_2':
         respI = 2
    
    # etc.
    
    exp.set('respI',respI)
    

    I hope you get the idea.

    Eduard

  • floflo
    edited November 2015

    Hi Eduard,

    this seems to work really well! I have used the suggested if-elif-else structure to determine the ID/index. When I use exp.set('varname', index), the logger will write varname to the .csv file. Awesome! Thanks a lot for that!

    Now I am wondering how I can display the score on the feedback sketchpad at the end. If I compute the score in the same inline_script and set it using exp.set('score', score), it gets written to the .csv as well. So that's great because I have trial-by-trial information regarding the score. However, when I try to set the text on the sketchpad to "Your score is [score].", it will complain that I am trying to use a variable that does not exist.

    You said above:

    you might have to add some extra book keeping in an inline_script (accessing current response and store them permanently in another variable)

    How would I go about doing this?

    Thank you for your time, Eduard - I really appreciate it!

    • Florian

    P.S.: I am using OpenSesame 2.9.6 on Mac OS Yosemite.

  • edited 12:57AM

    How would I go about doing this?

    I don't think it matters for your case. So just briefly, when using a loop to repeat some action and save some outcome to a variable, you need to make sure that you can use the outcome of each iteration, before it is overwritten by the next iteration. You can use lists rather than simple variables for example, but there many ways to go. At any rate, it should not matter for you.

    YOur problem lies in the prepare-run structure of OpenSesame. That is, since your outcome variable is computed during the run phase, on the fly, so to speak, it doesn't exist yet, when all the items in the sequence are initialized (during prepare).

    If you want to present feedback only once in the end of a block of questions, you can move it outside the sequence and you should be set (maybe you also have to initialize your score variable somewhere before). If you need it updated on every trial it is a bit more complicated.

    Eduard

  • floflo
    edited November 2015

    Thanks for the quick response.

    This is the structure of my experiment at the moment:

    It says here that "All inline_script items share the same workspace. This means that variables that are created in one inline_script are available in another inline_script." That's why I tried to initialize the score variable in the inline_script init_score (it contains only one line: score = 0). In the inline_script inside my sequence I have this code:

    # Update the score
    score = score + cresp
    exp.set('score', score)
    

    (cresp is either 0 or 1, indicating a correct response.)

    The logger will write this to the file but I still can't access score in the feedback sketchpad.

    If you want to present feedback only once in the end of a block of questions, you can move it outside the sequence and you should be set (maybe you also have to initialize your score variable somewhere before).

    That's what I did but I am still getting the message that the variable doesn't exist. How would I initialize it before and where?

    This is the very last step I need to make this work. :) Thanks a lot!

    • Florian
  • edited 12:57AM

    Ah, I was afraid this will happen. You could try the feedback item. So, don't use an a regular sketchpad, but the a version of it which is dedicated to make feedback presentation easier.

    Alternatively, instead of a sketchpad use an inline_script and and put your feedback in the runphase.

    from openexp.canvas import canvas
    
    cv = canvas(exp)
    feedback = 'You have %s out of %s correct!'% score, total_no
    cv.text(feedback)
    cb.show()
    self.sleep(5000) # of via keyboard.get_key()
    

    Eduard

  • floflo
    edited 12:57AM

    Hi Eduard,

    using a feedback item with the same text on it (i.e., "Your score is [score].") works without any problems! Beautiful. Thanks a lot for your help!

    • Florian
Sign In or Register to comment.