Skip to content

Change Rscript and `/usr/lib/R/bin/R` relation

4 messages · Cron Acronis, Alexey Zaharov, Dirk Eddelbuettel

#
Dear all,

I am trying to use multiple version of R unpacked from CRAN deb files.

It does work successfully, except for some packages installation, whether 
Rscript has been used. I have configured alternatives and switch R 
environments without any problem and can install most of the packages.

'======================================================
$ update-alternatives --display R
R - auto mode
  link currently points to /opt/R/3.2.3/usr/lib/R/bin/R
/opt/R/3.2.3/usr/lib/R/bin/R - priority 200
/usr/lib/R/bin/R - priority 100
Current 'best' version is '/opt/R/3.2.3/usr/lib/R/bin/R'.


$ update-alternatives --display Rscript
Rscript - auto mode
  link currently points to /opt/R/3.2.3/usr/lib/R/bin/Rscript
/opt/R/3.2.3/usr/lib/R/bin/Rscript - priority 200
/usr/lib/R/bin/Rscript - priority 100
Current 'best' version is '/opt/R/3.2.3/usr/lib/R/bin/Rscript'.
'======================================================

Rscript always invokes `/usr/lib/R/bin/R`, but my alternatives are 
configured against `/usr/bin/R`

'======================================================
$ Rscript --verbose -e 'Sys.getenv("R_HOME")'
running
  '/usr/lib/R/bin/R --slave --no-restore -e Sys.getenv("R_HOME")'

[1] "/usr/lib/R"
'======================================================

As have been mentioned by Dirk Eddelbuettel, in order to make Rscript 
invoke correct R, I can adjust `PATH` environment variable.

Which was done, but in my case didn't work out. Rscript still calls `/usr/
lib/R/bin/R`

'======================================================
$ env | grep PATH
PATH=/opt/R/3.2.3/usr/lib/R/bin:/opt/python/conda/bin::/usr/local/sbin:/
usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games


$ Rscript --version && Rscript --verbose -e 'print("Hello")'
    R scripting front-end version 3.2.3 (2015-12-10)
    running
      '/usr/lib/R/bin/R --slave --no-restore -e print("Hello")'

    [1] "Hello"
'======================================================


Could you please advise where I should dig further in order to force 
Rscript to use `/usr/bin/R` or `/opt/R/3.2.3/usr/lib/R/bin/R`?


Regards, Cron Acronis.
#
Thanks for bringing the question over from StackOverflow [1].  I am not very
impressed that you STILL hide behind a pseudonym and I am starting to
question my sanity as to why I take time out to help someone like
that. Anyway, read on ...

[1] http://stackoverflow.com/questions/35313704/rscript-launch-custom-r/
On 10 February 2016 at 15:50, Cron Acronis wrote:
| Dear all,
| 
| I am trying to use multiple version of R unpacked from CRAN deb files.

That will not work "as is". They have their path baked in.

You could expand them into a Docker container each, and invoke those.

You _could_ try re-setting RHOME, R_HOME, ...   But rest assured that you
attempt to deploy R in a way NOT foreseen or designed by the authors.

| It does work successfully, except for some packages installation, whether 
| Rscript has been used. I have configured alternatives and switch R 
| environments without any problem and can install most of the packages.
| 
| '======================================================
| $ update-alternatives --display R
| R - auto mode
|   link currently points to /opt/R/3.2.3/usr/lib/R/bin/R
| /opt/R/3.2.3/usr/lib/R/bin/R - priority 200
| /usr/lib/R/bin/R - priority 100
| Current 'best' version is '/opt/R/3.2.3/usr/lib/R/bin/R'.
| 
| 
| $ update-alternatives --display Rscript
| Rscript - auto mode
|   link currently points to /opt/R/3.2.3/usr/lib/R/bin/Rscript
| /opt/R/3.2.3/usr/lib/R/bin/Rscript - priority 200
| /usr/lib/R/bin/Rscript - priority 100
| Current 'best' version is '/opt/R/3.2.3/usr/lib/R/bin/Rscript'.
| '======================================================
| 
| Rscript always invokes `/usr/lib/R/bin/R`, but my alternatives are 
| configured against `/usr/bin/R`
| 
| '======================================================
| $ Rscript --verbose -e 'Sys.getenv("R_HOME")'
| running
|   '/usr/lib/R/bin/R --slave --no-restore -e Sys.getenv("R_HOME")'
| 
| [1] "/usr/lib/R"
| '======================================================
| 
| As have been mentioned by Dirk Eddelbuettel, in order to make Rscript 
| invoke correct R, I can adjust `PATH` environment variable.

That presumed a local build into the location where PATH finds it. That is
how some R Core members use different versions, and that approach 'was good
enough for me' too.   You are overcomplicating things here and get to pick up
the pieces.

| Which was done, but in my case didn't work out. Rscript still calls `/usr/
| lib/R/bin/R`
| 
| '======================================================
| $ env | grep PATH
| PATH=/opt/R/3.2.3/usr/lib/R/bin:/opt/python/conda/bin::/usr/local/sbin:/
| usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
| 
| 
| $ Rscript --version && Rscript --verbose -e 'print("Hello")'
|     R scripting front-end version 3.2.3 (2015-12-10)
|     running
|       '/usr/lib/R/bin/R --slave --no-restore -e print("Hello")'
| 
|     [1] "Hello"
| '======================================================
| 
| 
| Could you please advise where I should dig further in order to force 
| Rscript to use `/usr/bin/R` or `/opt/R/3.2.3/usr/lib/R/bin/R`?

Build from source into the chosen location.
 
| Regards, Cron Acronis.

In the future, use a real name if you want real help from real people.

Dirk
 
| _______________________________________________
| R-SIG-Debian mailing list
| R-SIG-Debian at r-project.org
| https://stat.ethz.ch/mailman/listinfo/r-sig-debian
1 day later
#
On Wed, 10 Feb 2016 10:18:51 -0600, Dirk Eddelbuettel wrote:

            
Dear Dirk,

Probably you would like to know, that I have managed to solve the problem 
by using `schroot`.

It can attach current user `home` folder to `rootfs` from `chroot` where.

After I have configured the `trusty64`, I have just created a clone.
Inside the clone I have installed another version of R from CRAN repo.
<--------------------------------START------------->
root at chroot-test:/# schroot -l
chroot:trusty64
chroot:trusty64_clone


$ cat /etc/schroot/chroot.d/trusty64.conf 
[trusty64]
description=Ubuntu 14.04 Trusty Tahr
directory=/test/schroot/trusty64
users=quant
type=directory
profile=desktop
#personality=linux
preserve-environment=true
root-groups=root

$ cat /etc/schroot/chroot.d/trusty64_clone.conf 
[trusty64_clone]
description=Ubuntu 14.04 Trusty Tahr
directory=/test/schroot/trusty64
users=quant
type=directory
profile=desktop
#personality=linux
preserve-environment=true
root-groups=root

root at chroot-test:/etc# debootstrap --variant=minbase --arch amd64 trusty /
test/schroot/trusty64/ http://archive.ubuntu.com/ubuntu/


root at chroot-test:/etc# schroot -c trusty64 -u quant
root at chroot-test:/etc# schroot -c trusty64_clone -u quant
<--------------------------------END--------------->
#
On 12 February 2016 at 15:11, Alexey Zaharov wrote:
| Probably you would like to know, that I have managed to solve the problem 
| by using `schroot`.

Good call.  We (as in Debian package managers) do something very similar for
package building, of course. And there is an entire infrastructure for it.

| It can attach current user `home` folder to `rootfs` from `chroot` where.
| 
| After I have configured the `trusty64`, I have just created a clone.
| Inside the clone I have installed another version of R from CRAN repo.
| <--------------------------------START------------->
| root at chroot-test:/# schroot -l
| chroot:trusty64
| chroot:trusty64_clone
| 
| 
| $ cat /etc/schroot/chroot.d/trusty64.conf 
| [trusty64]
| description=Ubuntu 14.04 Trusty Tahr
| directory=/test/schroot/trusty64
| users=quant
| type=directory
| profile=desktop
| #personality=linux
| preserve-environment=true
| root-groups=root
| 
| $ cat /etc/schroot/chroot.d/trusty64_clone.conf 
| [trusty64_clone]
| description=Ubuntu 14.04 Trusty Tahr
| directory=/test/schroot/trusty64
| users=quant
| type=directory
| profile=desktop
| #personality=linux
| preserve-environment=true
| root-groups=root
| 
| root at chroot-test:/etc# debootstrap --variant=minbase --arch amd64 trusty /
| test/schroot/trusty64/ http://archive.ubuntu.com/ubuntu/
| 
| 
| root at chroot-test:/etc# schroot -c trusty64 -u quant
| root at chroot-test:/etc# schroot -c trusty64_clone -u quant
| <--------------------------------END--------------->

That works. The key is that (as I said earlier) the path from / to the R
binaries and libs are 'fixed' at compile time -- but you can run several
virtual environment on the box to 'fake' different / path.  Docker is one
(portable) way and we offer a bunch of R containers for it already, and
within the Debian/Ubuntu world one can of course use different chroot-based
solutions: dchroot, schroot, pbuilder, cowbuilder, ...  Thanks for pointing
that last part out.

Dirk