Opened 9 years ago

Closed 7 years ago

#1149 closed enhancement (fixed)

WinGrass - load R-installation-path dynamically into PATH

Reported by: hellik Owned by: grass-dev@…
Priority: normal Milestone: 7.0.0
Component: Startup Version: svn-trunk
Keywords: wingrass, path, R Cc:
CPU: x86-32 Platform: MSWindows Vista

Description

Hi,

at the moment the WinGrass-Installer reads the Windows-registry during installation for the R-installation-path

http://trac.osgeo.org/grass/browser/grass/trunk/mswindows/GRASS-Installer.nsi#L219

ReadRegStr $R_HKLM_INSTALL_PATH HKLM "Software\R-core\R" "InstallPath"
ReadRegStr $R_HKCU_INSTALL_PATH HKCU "Software\R-core\R" "InstallPath"

and writes this, if found, to the grassXX.bat

http://trac.osgeo.org/grass/browser/grass/trunk/mswindows/GRASS-Installer.nsi#L728

${If} $R_HKLM_INSTALL_PATH != ""
FileWrite $0 'set PATH=$R_HKLM_INSTALL_PATH\bin;%PATH%$\r$\n'
${EndIf}
${If} $R_HKCU_INSTALL_PATH != ""
FileWrite $0 'set PATH=$R_HKCU_INSTALL_PATH\bin;%PATH%$\r$\n'
${EndIf}

this is a very statically approach to get the R-installation-path into the %PATH% and R working in the Grass-delivered command-line. that means, if R is upadated/upgraded, the Grass-delivered command-line can't find R in the %PATH% anymore.

a dynamically approach to add the R-installation-path to %PATH% would be better.

from the R-Windows-FAQ: http://cran.r-project.org/bin/windows/base/rw-FAQ.html#Does-R-use-the-Registry_003f

2.17 Does R use the Registry?

Not when R itself is running.

When you run the R installer, there are options (under `Select Additional Tasks') to `Save version number in registry' and (for Administrator installs) `Associate R with .RData files'.

If you tick the first option, the following string entries are added to the Windows registry:

    * HKEY_LOCAL_MACHINE\Software\R-core\R\Current Version contains the version number, currently 2.11.1.
    * HKEY_LOCAL_MACHINE\Software\R-core\R\[version]\InstallPath (where [version] is currently 2.11.1) contains the path to the R home directory. 

If you do not have administrative privileges on the machine while running the installer, then the entries are created under HKEY_CURRENT_USER. As from R 2.11.0 the same entries are also created under Software\R-core\R32 or Software\R-core\R64, for 32- and 64-bit R respectively.

If you tick the second option (shown with administrative privileges only) (`Associate R with .RData files') then entries are created under HKEY_CLASSES_ROOT\.RData and HKEY_CLASSES_ROOT\RWorkspace.

After installation you can add the Registry entries in by running RSetReg.exe in the bin folder, and remove them by running this with argument /U. Note that this requires administrative privileges unless run with argument /Personal and neither sets up nor removes the file associations. 

the following code lines in the windows-command-line outputs the R installation path:

reg query "HKLM\Software\R-core\R" /v "InstallPath"

or

reg query "HKCU\Software\R-core\R" /v "InstallPath"

in the following way:

C:\data\private\compiling_gis\detect_R_in_Dos>reg query "HKLM\Software\R-core\R" /v "InstallPath"

HKEY_LOCAL_MACHINE\Software\R-core\R
    InstallPath    REG_SZ    C:\Program Files\R\R-2.11.1

following line of code extract from the above output the R-installation path and set a variable which could be added to %PATH%

set RegCommand=reg query "HKLM\Software\R-core\R" /v "InstallPath"
FOR /f "tokens=1-2* delims= " %%a IN ( ' %RegCommand% ^| find "InstallPath" ' ) do set R_HKLM_INSTALL_PATH=%%c

or

set RegCommand2=reg query "HKCU\Software\R-core\R" /v "InstallPath"
FOR /f "tokens=1-2* delims= " %%a IN ( ' %RegCommand2% ^| find "InstallPath" ' ) do set R_HKCU_INSTALL_PATH=%%c

but if there is no value in registry, following error comes up:

C:\data\private\compiling_gis\detect_R_in_Dos>FOR /F "tokens=1-2* delims= " %a IN (' reg query "HKCU\Software\R-core\R" /v "InstallPath" | find "InstallPath" '
) do set R_HKCU_INSTALL_PATH=%c
ERROR: registry key or value couldn't be found.

following questions:

  • which of in the R-Windows-FAQ mentioned registry entries should be tested?
  • how could the above mentioned lines of code be added to grassXX.bad? (I'm not really familiar with this kind of coding)

this would be nice in order to have a R-session working in the Grass-delivered command line, independently if the R-installation has changed.

best regards Helmut

Attachments (5)

dynamic_test_if_R_is_installed.bat (1.9 KB) - added by hellik 9 years ago.
Dynamic check where R lives and added to path
grass64svn_add_dynamically_R_path.patch (3.4 KB) - added by hellik 9 years ago.
Add dynamically R to Path for WinGrass64svn
grass65_add_dynamically_R_path.patch (3.4 KB) - added by hellik 9 years ago.
Add dynamically R to Path for WinGrass65
grass70_add_dynamically_R_path.patch (3.4 KB) - added by hellik 9 years ago.
Add dynamically R to Path for WinGrass70
README_rbatch.txt (14.3 KB) - added by hellik 7 years ago.
README r batch

Download all attachments as: .zip

Change History (17)

comment:1 in reply to:  description ; Changed 9 years ago by glynn

Replying to hellik:

  • which of in the R-Windows-FAQ mentioned registry entries should be tested?

HKCU first, then HKLM if nothing found under HKCU.

comment:2 in reply to:  1 ; Changed 9 years ago by hellik

Replying to glynn:

Replying to hellik:

  • which of in the R-Windows-FAQ mentioned registry entries should be tested?

HKCU first, then HKLM if nothing found under HKCU.

I have R 2.12.0 installed in C:\Program Files\R\R-2.12.0.

according to the R-Windows-FAQ, the R-binaries are installed

in a Win32-installation: C:\Program Files\R\R-2.12.0\bin\i386\

in a Win64-installation: C:\Program Files\R\R-2.12.0\bin\x64\

If I write following search-routine in a bat-file (for example c:\temp\addrtopath.bat) for all possible cases

set RegCommandHKCU32=reg query "HKCU\Software\R-core\R32" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKCU32% ^| find "InstallPath"') do set R_HKCU32_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKCU32_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKCU32_INSTALL_PATH%\bin\i386) >nul 2>&1
set RegCommandHKCU64=reg query "HKCU\Software\R-core\R64" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKCU64% ^| find "InstallPath"') do set R_HKCU64_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKCU64_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKCU64_INSTALL_PATH%\bin\x64) >nul 2>&1
rem Test if R is registered in HKLM
set RegCommandHKLM32=reg query "HKLM\Software\R-core\R32" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKLM32% ^| find "InstallPath"') do set R_HKLM32_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKLM32_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKLM32_INSTALL_PATH%\bin\i386) >nul 2>&1
set RegCommandHKLM64=reg query "HKLM\Software\R-core\R64" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKLM64% ^| find "InstallPath"') do set R_HKLM64_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKLM64_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKLM64_INSTALL_PATH%\bin\x64) >nul 2>&1

and start that bat-file on my winvista32-box in a normal windows-cmd, the R-installation is found correctly and in my case C:\Program Files\R\R-2.12.0\bin\i386\ is added to path and I can start R by typing R in the windows-cmd where I have run the bat-file.

If I add these line of code above into C:\Program Files\GRASS-70-SVN\grass70svn.bat (Wingrass70-starting script), R isn't added to the path.

any hints?

best regards Helmut

Changed 9 years ago by hellik

Dynamic check where R lives and added to path

comment:3 in reply to:  2 ; Changed 9 years ago by hellik

Replying to hellik:

Replying to glynn:

set RegCommandHKCU32=reg query "HKCU\Software\R-core\R32" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKCU32% ^| find "InstallPath"') do set R_HKCU32_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKCU32_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKCU32_INSTALL_PATH%\bin\i386) >nul 2>&1
set RegCommandHKCU64=reg query "HKCU\Software\R-core\R64" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKCU64% ^| find "InstallPath"') do set R_HKCU64_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKCU64_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKCU64_INSTALL_PATH%\bin\x64) >nul 2>&1
rem Test if R is registered in HKLM
set RegCommandHKLM32=reg query "HKLM\Software\R-core\R32" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKLM32% ^| find "InstallPath"') do set R_HKLM32_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKLM32_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKLM32_INSTALL_PATH%\bin\i386) >nul 2>&1
set RegCommandHKLM64=reg query "HKLM\Software\R-core\R64" /v "InstallPath" >nul 2>&1
FOR /f "tokens=1-2* delims= " %%a IN ('%RegCommandHKLM64% ^| find "InstallPath"') do set R_HKLM64_INSTALL_PATH=%%c >nul 2>&1
IF "%R_HKLM64_INSTALL_PATH%" NEQ "" (PATH=%PATH%;%R_HKLM64_INSTALL_PATH%\bin\x64) >nul 2>&1

sorry above isn't really working.

I've attached instead a simple working bat-file to check dynamically if and where R is installed and added to the path.

but if these lines are added to grass70svn.bat, they are not working correctly.

any hints what have to be changed?

Helmut

Changed 9 years ago by hellik

Add dynamically R to Path for WinGrass64svn

Changed 9 years ago by hellik

Add dynamically R to Path for WinGrass65

comment:4 in reply to:  3 ; Changed 9 years ago by hellik

Replying to hellik:

I've attached instead a simple working bat-file to check dynamically if and where R is installed and added to the path.

I've attached working patches for WinGrass64svn and WinGrass65.

tested with a patched WinGrass6.4.1RC2, it's working now. R can be started within a WinGrass-text-mode-session.

the improvement is that R is added to %PATH% dynamically instead of the actually very static approach which detects R only during wingrass-installation and, after installing new R-versions, it's not possible anymore to start a R-session within a wingrass-session because of the false path.

any opinion for not adding it to grass65 and after some testing to grass64svn?

Helmut

Changed 9 years ago by hellik

Add dynamically R to Path for WinGrass70

comment:5 in reply to:  4 ; Changed 9 years ago by hellik

Replying to hellik:

I've attached working patches for WinGrass64svn and WinGrass65.

also now attached a working tested patch for WinGrass70.

after some cleaning of the messages, it would be nice to have it in all branches.

I'm often coupling R and grass inside a grass-session in windows, it's a very nice feature for analysing gis-data to have.

Helmut

comment:6 in reply to:  5 ; Changed 9 years ago by hellik

Replying to hellik:

Replying to hellik:

I've attached working patches for WinGrass64svn and WinGrass65.

also now attached a working tested patch for WinGrass70.

after some cleaning of the messages, it would be nice to have it in all branches.

I'm often coupling R and grass inside a grass-session in windows, it's a very nice feature for analysing gis-data to have.

see also Windows batchfiles for use with R

comment:7 in reply to:  6 ; Changed 9 years ago by hellik

Replying to hellik:

Replying to hellik:

Replying to hellik:

I've attached working patches for WinGrass64svn and WinGrass65.

also now attached a working tested patch for WinGrass70.

after some cleaning of the messages, it would be nice to have it in all branches.

I'm often coupling R and grass inside a grass-session in windows, it's a very nice feature for analysing gis-data to have.

see also Windows batchfiles for use with R

I've tested following in my win32-vista-box

  • installed nightly build WinGRASS-7.0.SVN-r46330-1-Setup.exe
  • started "GRASS 7.0.SVN with MSYS" by the desktop-shortcut
  • in the windows-command-line of "GRASS 7.0.SVN with MSYS" it's possible to start a R-session within a Grass-session (recognizing all Grass-environment-variables) by typing cmd R.bat
  • in the windows-command-line of "GRASS 7.0.SVN with MSYS" it's possible to start a R-GUI-session within a Grass-session (recognizing all Grass-environment-variables) by typing cmd Rgui.bat

so I strongly recommend using the bat-files from http://code.google.com/p/batchfiles/ for a smoothly WinGrass-R-integration.

the bat-files are gpl'ed, so there's maybe no problem to include them in an wingrass-selfinstaller?

after some tweaking (i.e. starting from the wxgui, ...), this would be a great and an all-time improvement coupling wonderfull GIS- and (geo-)statistic- software in the windows environment.

Helmut

comment:8 in reply to:  7 Changed 9 years ago by hellik

Replying to hellik:

Replying to hellik:

Replying to hellik:

Replying to hellik:

I've attached working patches for WinGrass64svn and WinGrass65.

also now attached a working tested patch for WinGrass70.

after some cleaning of the messages, it would be nice to have it in all branches.

I'm often coupling R and grass inside a grass-session in windows, it's a very nice feature for analysing gis-data to have.

see also Windows batchfiles for use with R

I've tested following in my win32-vista-box

  • installed nightly build WinGRASS-7.0.SVN-r46330-1-Setup.exe
  • started "GRASS 7.0.SVN with MSYS" by the desktop-shortcut
  • in the windows-command-line of "GRASS 7.0.SVN with MSYS" it's possible to start a R-session within a Grass-session (recognizing all Grass-environment-variables) by typing cmd R.bat
  • in the windows-command-line of "GRASS 7.0.SVN with MSYS" it's possible to start a R-GUI-session within a Grass-session (recognizing all Grass-environment-variables) by typing cmd Rgui.bat

so I strongly recommend using the bat-files from http://code.google.com/p/batchfiles/ for a smoothly WinGrass-R-integration.

the bat-files are gpl'ed, so there's maybe no problem to include them in an wingrass-selfinstaller?

after some tweaking (i.e. starting from the wxgui, ...), this would be a great and an all-time improvement coupling wonderfull GIS- and (geo-)statistic- software in the windows environment.

a small correction

  • start "GRASS 7.0.SVN with MSYS"
  • type in the command-line-window cmd for enabling a windows-command-line
  • type R.bat for starting a R-commandline-session within a wingrass-session or type Rgui.bat for starting a R-GUI-session within a winggrass-session (in both cases recognizing all Grass-environment-variables)

Helmut

comment:9 in reply to:  7 ; Changed 7 years ago by hellik

Replying to hellik:

so I strongly recommend using the bat-files from http://code.google.com/p/batchfiles/ for a smoothly WinGrass-R-integration.

the bat-files are gpl'ed, so there's maybe no problem to include them in an wingrass-selfinstaller?

answer from Gabor Grothendieck, author of "Windows batchfiles for use with R".

Von: Gabor Grothendieck <...>
Betreff: Re: WinGRASS GIS-R-integration via "Windows batchfiles for use with R"
Datum:	Thu, 23. Aug 2012 23:06:30

Hi, If the entire project is GPL'd or subject to reasonably similar
license(s) then there is no reason you could not distribute additional
GPL'd software like the batchfiles with it.  I think the license only
requires preservation of authorship and maintaining the free status.
Regards.

the batch-files are:

PROGRAM LIST

Legend:
h = no args gives help
0 = common usage is to enter command name without arguments
d = in development
2.11 = only works with R 2.11
* = all files marked with one star are the same.  Program checks name by which its called to determine action.
** = all files marked with two stars are the same.  Program checks name by which its called to determine action.

#Rscript.bat - put at top of R file to make it a batch file (h) (*)
clip2r.js - pastes clipboard into Rgui.  See comments in file for use from vim. (0)(d)
copydir.bat - copy a library from one version of R to another (h)
el.js - run elevated - Vista and up, e.g. el Rgui  runs R elevated
find-miktex.hta - GUI to find MiKTeX (0)
kopy.bat - copy Rcmd to other batch files (h)(d)
movedir.bat - move library from one version of R to another (h) 
R.bat - like R.exe but finds R from registry (0) (*)
Rcmd.bat - like Rcmd.exe but finds R from registry (h) (*)
Rgui.bat - like Rgui.exe but finds R from registry (0) (*)
RguiStart.bat - like Rgui.bat but arg1 defines folder to start R in (*)
Rscript.bat - run .R script (h) (*)
Rterm.bat - like rterm.exe but finds R from registry (h) (*)
Rtidy.bat - reformat a .R file, e.g. Rtidy myfile.R > outfile.R (d)
Rtools.bat - place Rtools on path for remainder of console session (0) (*)
Rversions.bat - list R and set R version in registry, e.g. on Vista: el cmd/c Rversions R-2.10.1 (0)
Rversions.hta - GUI interface to RSetReg.  List and set R version, e.g. on Vista: el cmd /c Rversions.hta (0)(2.11)
show-svn-info.hta - show svn info if current folder is an svn checkout (0)
Stangle.bat - run arg1 through Stangle (h) (**)
Sweave.bat - run arg1 through Sweave (h) (**)

the entire README of rbatch-files attached to this ticket.

so may I propose to integrate the batch files in the GRASS GIS source in

\src\grass_trunk\mswindows\external\rbatch

and the standalone WinGrass-installer installing the files in

C:\Program Files (x86)\GRASS GIS 7.0.svn\extrabin

tested here locally, it's working.

this would be a great and an all-time improvement coupling wonderfull GIS- and (geo-)statistic- software in the windows world.

any opinions, objections, hints ...?

Helmut

Changed 7 years ago by hellik

Attachment: README_rbatch.txt added

README r batch

comment:10 in reply to:  9 ; Changed 7 years ago by hellik

Replying to hellik:

any opinions, objections, hints ...?

done in

grass trunk:

r53032 r53033 r53034

grass devbr6:

r53035 r53036

...testing welcome

Helmut

comment:11 in reply to:  10 Changed 7 years ago by hellik

Replying to hellik:

Replying to hellik:

any opinions, objections, hints ...?

done in

grass trunk:

r53032 r53033 r53034

grass devbr6:

r53035 r53036

...testing welcome

wiki updated:

http://grass.osgeo.org/wiki/R_statistics#Usage_III

Helmut

comment:12 in reply to:  10 Changed 7 years ago by hellik

Resolution: fixed
Status: newclosed

Replying to hellik:

done in

grass trunk:

r53032 r53033 r53034

grass devbr6:

r53035 r53036

closing ticket.

Note: See TracTickets for help on using tickets.