[GRASS-dev] [GRASS-user] v.class.mlR Error

[Moving this to grass-dev as this is becoming a more involved development discussion.]

On 31/05/18 11:47, Helmut Kudrnovsky wrote:

Here's a complete working example of the entire OBIA chain in the NC
dataset (warning: this is a demo example, not necessarily one of best
practice ;-)) :

thanks, testing it here now.

https://trac.osgeo.org/grass/browser/grass-addons/grass7/vector/v.class.mlR/v.class.mlR.py#L278

278 install_package = "if(!is.element('%s',
installed.packages()[,1])){\n"
279 install_package += "cat('\\n\\nInstalling %s package from
CRAN\n')\n"
280 install_package += "if(!file.exists(Sys.getenv('R_LIBS_USER'))){\n"
281 install_package += "dir.create(Sys.getenv('R_LIBS_USER'),
recursive=TRUE)\n"
282 install_package += ".libPaths(Sys.getenv('R_LIBS_USER'))}\n"
283 install_package += "chooseCRANmirror(ind=1)\n"
284 install_package += "install.packages('%s', dependencies=TRUE)}"

for installling packages in windows R:

https://cran.r-project.org/bin/windows/base/rw-FAQ.html#I-don_0027t-have-permission-to-write-to-the-R_002d3_002e5_002e0_005clibrary-directory

for installing system wide in windows administrator rights are needed. maybe
some possible source of troubles.

The .libPaths(Sys.getenv('R_LIBS_USER')) call should set the installation directory to the user's. But maybe this is not guaranteed to be defined which wouldn't make it a good option.

so maybe a recommendation in the manual?: let the user install the needed
packages first in R itself, then start the grass addon.

This module was originally developed for a classroom environment with the attempt to not force students (who don't know R for most parts at that stage) to have to do R packages installations, especially since which R packages you have to install depends on which classifiers you use.

But maybe you are right that we should just declare the R packages as dependencies up to the user to install.

Or rewrite the whole thing in scikit-learn just as r.learn.ml. At the time, it seemed more robust to assume a general R installation and install the needed packages automatically than to assume the presence of the correct version of scikit-learn...

addon test here shows:

-----------------
v.class.mlR --verbose segments_map=lsat7_segs_stats training_map=training
train_class_colum=class
Running R now. Following output is R output.
Loading required package: caret
Loading required package: lattice
Loading required package: ggplot2
There were 50 or more warnings (use warnings() to see the first 50)
Error in file(file, ifelse(append, "a", "w")) :
   cannot open the connection
Calls: write.csv -> eval.parent -> eval -> eval -> write.table -> file
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
   cannot open file '.gscript_tmp_model_output_1300.csv': Permission denied
Execution halted
ERROR: There was an error in the execution of the R script.
Please check the R output.
-----------------

it seems, R is started, packages loaded correctly.

where is the file '.gscript_tmp_model_output_1300.csv' written to?

485 if allmap and not flags['f']:
486 model_output = '.gscript_tmp_model_output_%d.csv' % os.getpid()
487 write_string = "write.csv(resultsdf, '%s'," % model_output
488 write_string += " row.names=FALSE, quote=FALSE)"
489 r_file.write(write_string)
490 r_file.write("\n")

Cf the other mail.

would it be possible to catch the R error/output?

Could you elaborate ? The module already goes through a try/except running R:

     gscript.message("Running R now. Following output is R output.")
     try:
         subprocess.check_call(['Rscript', r_commands], stderr=subprocess.STDOUT, )
     except subprocess.CalledProcessError:
         gscript.fatal("There was an error in the execution of the R script.\nPlease check the R output.")

And in your above about everything from "Running R now. Following output is R output." is the R output.

What else do you mean by catch the R output ?

Moritz

for installing system wide in windows administrator rights are needed.

maybe

some possible source of troubles.

The .libPaths(Sys.getenv('R_LIBS_USER')) call should set the
installation directory to the user's. But maybe this is not guaranteed
to be defined which wouldn't make it a good option.

checking here on my system:

mypath <- .libPaths(Sys.getenv('R_LIBS_USER'))
mypath

[1] "C:/Program Files/R/R-3.4.4/library"

in this situation, I need administrator rights to install packages. thus
there may be a wide range of different settings out there in the windows
wild.

What else do you mean by catch the R output ?

---------
There were 50 or more warnings (use warnings() to see the first 50)
Error in file(file, ifelse(append, "a", "w")) :
  cannot open the connection
Calls: write.csv -> eval.parent -> eval -> eval -> write.table -> file
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
  cannot open file '.gscript_tmp_model_output_1300.csv': Permission denied
Execution halted
ERROR: There was an error in the execution of the R script.
Please check the R output.
---------

so maybe I misread the last sentence. :wink:

-----
best regards
Helmut
--
Sent from: http://osgeo-org.1560.x6.nabble.com/Grass-Dev-f3991897.html