A few troubleshooting ideas:
... R script scheduled to run on a linux server....
Whenever I hear "scheduled", I think "cron" and when I hear "cron", I think "path problems". So in the server / schedule context, I recommend doing very pedantic checks that you truly understand what working directory is, who the user is, and whether a path is resolving to what you intend.
However, the fact that this service account token doesn't even seem to work for you in a local interactive session suggests something is wrong with the file. Historically, people have tried to use other JSON files, such as the JSON for an OAuth client, as if it were the JSON for a service account, which does not work, for obvious reasons.
You can gain more insight into how this is failing and falling through to interactive auth by using the gargle verbosity option as described here:
And in case you have not already found it (and for the benefit of other readers) here is a general overview of how to set up non-interactive auth: