The approach I pitch above might also be used for your ideal scenario; just ignore the csv argument passed to the filter function and have it return whatever you’d like. I’ll go pitch this idea now. Meanwhile, some more brainstorming…
We could have function return a CSV or a JSON, though it could be a bit confusing what extension to store the file in. Maybe just keep the CSV extension and have researchers import that as a JSON later on.
Personally, I had a lot of trouble getting R to read the JSON file and even more trouble trying to manipulate into a workable form for analysis. I would be happy enough with just a csv option and my guess is that most researchers would agree.
If I could just tell Pavlovia what data to save it woudl be amazing!
I built it, now waiting for a code review, so that I’m sure it’s solid. Meanwhile a suggestion. I noticed that jsPsych already offers all kinds of data filtering options. You could try them out in the browser console while the task is running. If my modifications pass the review, you’ll have access to these options.
Done! Here you can find a modified version of the Pavlovia plugin that allows you filter out data and/or upload arbitrary data to the Pavlovia server. It comes with a demo task and a bit of documentation. I hope this suits your needs!
Thank you a lot for this function ! I tried many hours to do that because I wanted to save JSON data but I’m not good enough ! You give an answer to my question on this post, now it’s simple :
thanks for your answer concerning the json extension, I used it and it worked well. But i have one question, it seems that this part of the code is used only when the experiment finished without any problem. When there is incomplete data the data are not json nor csv, just some text with coma separator. Is it possible to fix that ?
Hey @F_Elisabeth, I guess so, but I’ll need to do a deep dive for it. I put in on my 2do list, but it might take a couple of days before I’ve got a result for you.
@F_Elisabeth, I took a peek at the code. I see that our pavlovia plugin does attempt to store the data when a participant closes their web-browser half-way through a task, but that isn’t very reliable; it uses features that web-browsers have been disabling because they can be abused by malicious web-sites. Is this the scenario you’re thinking of when you speak of incomplete data or is it perhaps something else I’m not considering?
Hi, it’s okay ! It was just in case of a crash during the experiment or something like that. I have some pretest such as an “audiogram like” trial so in the case of a crash it would be interesting to not doing again but I’m conscious we have to do with what the browsers let us do. Anyway, thank you to had a look at it !
Edit: I had forgotten to include completedCallback as an argument to the definition of my pavlovia finish trial, which is what was causing an error. The argument seems mandatory, although not sure if it should be.
Thanks for your work on this @thomas_pronk ! Another interesting pondering I have is why only the main data object from jsPsych is saved. For instance, I would like to save the interaction data but I am struggling to get it to work properly. My central attempt consists of adding a _save() call within the plugin trial method (in the case: ‘finish’ block, before await _finish) and data do get end up saved but I am getting an error on the screen to the participant.
I am attaching the file I am using (this is essentially a modified version of your script). Any help would be greatly appreciated! NB: The file is saved as .py but is actually a .js file – the forum does not let me upload .js files. jspsych-pavlovia-2020.4-custom.py (16.7 KB)
I love it when people build on my code! Here are some thoughts:
My hunch is that my dataFilter filter implementation would already solve it. It receives some data but you could interact with all kinds of jsPsych objects in there? However, I’m actually now that knowledgeable of jsPsych, so I might be wrong. Which takes me to…
Shall we chat about it on the jsPsych forum? (got a thread there). We might get some nice input from their devs.
And maybe move this the Pavlovia-plugin to a GitHub repo, then it’s easier for me to track your edits, file PRs etc.
Thanks for your reply @thomas_pronk. I think I will do a PR for the plugin soon. I really want to try and figure out how to most effectively and efficiently also implement a case for the ‘command’ parameter of ‘save’ that sends a request to the pavlovia in the middle of the experiment.
In my current lab, we have to pause in the middle of experiments to save data to pavlovia which is just annoying. Why do we need to pause? Because pavlovia has been troublesome in the past with data not saving randomly and 1 experiment losing about 10% of PPs’ data, resulting in overall costs in the hundreds (which is substantial for a psychology lab).
Essentially, I want to be able to send a data save request to pavlovia in the middle of the experiment asynchronously without closing/reopening the connection sessions. That should be a sufficient solution for multiple data saves.
Will let you know when I have something to push to GitHub.
About the issue you report: I guess we could tackle this on multiple levels. An earlier version of the plugin had the issue that redirecting a participant to another website at the end of a jsPsych task could result in the data not being saved properly. This particular issue should be fixed since version 2020.3 of the jsPsych Pavlovia plugin, in which you can specify a callback that’s triggered once Pavlovia confirms it received the data. By putting your redirect in this callback you can ensure that the participant is only sent on if the data is in.
Regardless, I’m all up for updates and improvements! Are you thinking of a PR via gitlab.pavlovia.org?
Hi there,
I’m at the moment integrating task with Pavlovia. As we also have a lot of data, I’m making use of your completedCallback function.
It works with showing the ‘alert’, as in your original code. Do you know whether it’s possible to instead show a div, like so:
$("#endExperiment").show();
When I use this code anywhere else in my script, it shows the div as expected. But when I put it within the callback, it doesn’t work. (I can manage to hide: $(’.jspsych-content-wrapper’).hide(), but not to then show my own div)