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

Moritz Lennert mlennert at club.worldonline.be
Thu May 31 04:28:48 PDT 2018


[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


More information about the grass-dev mailing list