<div dir="ltr"><div>I actually think that the issue may be related to conversions between int/IntegerVectors and double/NumericVector/std::vector<double>. 
I was talking with the terra package author to see if the focalCpp function 
can take an IntegerVector instead of a NumericVector/
/std::vector<double>,

as it seemed initially to be working and he said that 
Rcpp automatically coerces a std::vector<double> to an 
Rcpp::IntegerVector. However, when I replace the call to C_make_glcm which was causing the issue to just out(i,0) = xw[0] (i.e. return the first value), the edges that should be NA evaluate to -2147483648 so maybe this automatic conversion doesn't work if there are NAs. I can reproduce this using only Rcpp by having a function that takes an IntegerVector and returns the first value of that vector as a double, in which case NA's are changed to -2147483648 (code below). Is this expected behavior, and are there any ways to guard against this?</div><div><br></div><div>Thanks,</div><div>Alex<br></div><div><br></div><div><br></div><div>library(Rcpp)<br>cppFunction('double C_fun2(IntegerVector x){<br>  size_t start = 0;<br>  size_t end = x.length()-1;<br>  IntegerVector xw = x[Rcpp::Range(start,end)]; //Current window of elevation values<br>  double out=xw[0];<br>  return(out);<br>}')<br><br>C_fun2(c(NA,1))<br># -2147483648</div><div><br></div>

</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 13, 2021 at 3:43 PM Alex Ilich <<a href="mailto:alexilich93@gmail.com">alexilich93@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Thanks for digging into this for me. If focal_val is 16, then this is an out of bounds error as the matrix is 16x16 and the maximum index can be 15. What I'm confused about is that focal_val comes from the data which has been transformed to be restricted to integers in the range of 0-15 (0 - n_levels-1). This is explicitly checked for in the glcm_textures2 function with the line " if((terra::global(r, fun = max) > (n_levels-1)) | (terra::global(r, fun = min) < 0)){stop("Error: raster must have values between 0 and n_levels-1")}". Additionally, if I start with numbers in 0-15 and don't do any transformation (quantization="none"), I still run into this issue (see code below).</div><div><br></div><div>
<div>Thanks,</div><div>Alex</div>

</div><div><br></div><div>library(terra)<br>library(raster)<br>library(GLCMTextures)<br><br>r1b<- terra::rast(volcano)<br>set.seed(5)<br>values(r1b)<- sample(0:15, size = ncell(r1b), replace = TRUE) # Replace values with random integers from 0-15<br>r2b<- glcm_textures2(r1b, w=c(3,7), n_levels = 16, quantization = "none", shift=c(0,1)) #Often leads to Rsession Aborted</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 13, 2021 at 3:12 PM Bill Dunlap <<a href="mailto:williamwdunlap@gmail.com" target="_blank">williamwdunlap@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">In this example vgdb shows that valgrind's first complaint is at <div>(gdb) where 5<br>#0  0x000000001c1ada01 in C_make_glcm (x=..., n_levels=16, shift=..., na_opt=...) at glcm_cpp_functions.cpp:73<br>#1  0x000000001c1b2238 in C_glcm_textures_helper2 (x=..., w2=..., n_levels=16, shift=..., na_opt=..., ni=1, nw=21)<br>    at glcm_cpp_functions.cpp:218<br>#2  0x000000001c1a098e in _GLCMTextures_C_glcm_textures_helper2 (xSEXP=0x19023168, w2SEXP=0x92cbde8,<br>    n_levelsSEXP=0xa3138d8, shiftSEXP=0x92cc468, na_optSEXP=0xa313398, niSEXP=0xb655560, nwSEXP=0x1aeec7d0)<br>    at RcppExports.cpp:94<br>#3  0x00000000001f6b02 in R_doDotCall (<br>    ofun=0x1c1a0732 <_GLCMTextures_C_glcm_textures_helper2(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP)>, nargs=7,<br>    cargs=0x1ffeff6830, call=0x15ed3c88) at /mnt/c/R/R-svn/trunk/src/main/dotcode.c:622<br>#4  0x00000000002637ca in bcEval (body=0x15ed4078, rho=0x19023210, useCache=TRUE)<br>    at /mnt/c/R/R-svn/trunk/src/main/eval.c:7695<br></div><div><br></div><div>Line 73 is</div><div><span style="box-sizing:border-box;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">  GLCM</span><span style="color:rgb(36,41,47);font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">(neighbor_val,focal_val) = </span><span style="box-sizing:border-box;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">GLCM</span><span style="color:rgb(36,41,47);font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">(neighbor_val,focal_val)+</span><span style="box-sizing:border-box;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">1</span><span style="color:rgb(36,41,47);font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap">;</span><br></div><div><table style="border-spacing:0px;border-collapse:collapse;color:rgb(36,41,47);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px"><tbody style="box-sizing:border-box"><tr style="box-sizing:border-box;background-color:transparent"></tr><tr style="box-sizing:border-box"><td id="gmail-m_76005883119939777gmail-m_-7492893600410853510gmail-LC59" style="box-sizing:border-box;padding:0px 10px;line-height:20px;vertical-align:top;overflow:visible;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;white-space:pre-wrap"></td></tr></tbody></table>where GLCM is a 16 x 16 IntegerMatrix and focal_val is 16:</div><div>   (gdb) print neighbor_val<br>   $1 = 9<br>   (gdb) print focal_val <br>   $2 = 16<br>   (gdb) print i<br>   $3 = 2<br>   (gdb) print j<br>   $4 = 1<br></div><div><br></div><div>-Bill</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 13, 2021 at 11:37 AM Bill Dunlap <<a href="mailto:williamwdunlap@gmail.com" target="_blank">williamwdunlap@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Thanks, I hadn't noticed the --use-valgrind option to check.<div><br></div><div>I often run R under valgrind with the command line:</div><div>  $ R --quiet --no-save --debugger=valgrind --debugger-args="--track-origins=yes --vgdb=full --vgdb-error=0"</div><div>then in another window start a debugger process with</div><div>  $ gdb RHOME/bin/exec/R</div><div>  ...</div><div>   (gdb) target remote | vgdb</div><div>   (gdb) cont</div><div>You may need to supply a complete path to vgdb, valgrind's interface to gdb.</div><div>Then gdb will set breakpoints where valgrind reports memory misuse and you can inspect variables, etc., where an error occurs.</div><div>You can check for memory leaks from gdb with</div><div>   (gdb) monitor leak_check full</div><div><br></div><div>-Bill</div><div>  </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 13, 2021 at 10:29 AM Dirk Eddelbuettel <<a href="mailto:edd@debian.org" target="_blank">edd@debian.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
On 13 December 2021 at 09:15, Bill Dunlap wrote:<br>
| I ran your example under valgrind on Linux (Ubuntu 20.04)<br>
<br>
Excellent call, as usual!  Thanks for doing that.<br>
<br>
R actually makes is so easy to run with valgrind by calling<br>
<br>
   R CMD check --use-valgrind somePkg_1.2-3.tar.gz<br>
<br>
that I started to add it to some CI setups.<br>
<br>
Dirk<br>
<br>
| and valgrind found some memory misuse:<br>
| <br>
| $ R --quiet --no-save --debugger=valgrind<br>
| --debugger-args="--track-origins=yes"<br>
| ==1533== Memcheck, a memory error detector<br>
| ==1533== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.<br>
| ==1533== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info<br>
| ==1533== Command: /home/bill/R-devel/R-build/bin/exec/R --quiet --no-save<br>
| ==1533==<br>
| > library(terra)<br>
| terra version 1.5.2<br>
| > library(raster)<br>
| Loading required package: sp<br>
| > library(GLCMTextures)<br>
| ><br>
| > r1a<- raster::raster(volcano)<br>
| > r2a<- glcm_textures(r1a, w=c(3,7), n_levels = 16, quantization = "equal<br>
| prob", shift=c(0,1))<br>
| ><br>
| > r1b<- terra::rast(volcano)<br>
| > r2b<- glcm_textures2(r1b, w=c(3,7), n_levels = 16, quantization = "equal<br>
| prob", shift=c(0,1)) #Often leads to Rsession Aborted<br>
| ==1533== Invalid read of size 4<br>
| ==1533==    at 0x1C1ADA01: C_make_glcm(Rcpp::Matrix<13,<br>
| Rcpp::PreserveStorage>, int, Rcpp::Vector<13, Rcpp::PreserveStorage>,<br>
| Rcpp::String) (glcm_cpp_functions.cpp:73)<br>
| ==1533==    by 0x1C1B2237: C_glcm_textures_helper2(Rcpp::Vector<13,<br>
| Rcpp::PreserveStorage>, Rcpp::Vector<13, Rcpp::PreserveStorage>, int,<br>
| Rcpp::Vector<13, Rcpp::PreserveStorage>, Rcpp::String, unsigned long,<br>
| unsigned long) (glcm_cpp_functions.cpp:218)<br>
| ==1533==    by 0x1C1A098D: _GLCMTextures_C_glcm_textures_helper2<br>
| (RcppExports.cpp:94)<br>
| ==1533==    by 0x1F6B01: R_doDotCall (dotcode.c:622)<br>
| ==1533==    by 0x2637C9: bcEval (eval.c:7695)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x240E06: Rf_eval (eval.c:871)<br>
| ==1533==    by 0x246CD6: do_set (eval.c:2990)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x2457DA: do_begin (eval.c:2538)<br>
| ==1533==  Address 0xa59c0c4 is 28 bytes before a block of size 64 in arena<br>
| "client"<br>
| ==1533==<br>
| ==1533== Invalid write of size 4<br>
| ==1533==    at 0x1C1ADA44: C_make_glcm(Rcpp::Matrix<13,<br>
| Rcpp::PreserveStorage>, int, Rcpp::Vector<13, Rcpp::PreserveStorage>,<br>
| Rcpp::String) (glcm_cpp_functions.cpp:73)<br>
| ==1533==    by 0x1C1B2237: C_glcm_textures_helper2(Rcpp::Vector<13,<br>
| Rcpp::PreserveStorage>, Rcpp::Vector<13, Rcpp::PreserveStorage>, int,<br>
| Rcpp::Vector<13, Rcpp::PreserveStorage>, Rcpp::String, unsigned long,<br>
| unsigned long) (glcm_cpp_functions.cpp:218)<br>
| ==1533==    by 0x1C1A098D: _GLCMTextures_C_glcm_textures_helper2<br>
| (RcppExports.cpp:94)<br>
| ==1533==    by 0x1F6B01: R_doDotCall (dotcode.c:622)<br>
| ==1533==    by 0x2637C9: bcEval (eval.c:7695)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x240E06: Rf_eval (eval.c:871)<br>
| ==1533==    by 0x246CD6: do_set (eval.c:2990)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x2457DA: do_begin (eval.c:2538)<br>
| ==1533==  Address 0xa59c0c4 is 28 bytes before a block of size 64 in arena<br>
| "client"<br>
| ==1533==<br>
| --1533-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) -<br>
| exiting<br>
| --1533-- si_code=1;  Faulting address: 0x10A59C138;  sp: 0x10090e2e20<br>
| <br>
| valgrind: the 'impossible' happened:<br>
|    Killed by fatal signal<br>
| <br>
| host stacktrace:<br>
| ==1533==    at 0x580505C4: ??? (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/memcheck-amd64-linux)<br>
| ==1533==    by 0x58004EBB: ??? (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/memcheck-amd64-linux)<br>
| ==1533==    by 0x58005DA7: ??? (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/memcheck-amd64-linux)<br>
| ==1533==    by 0x580A7204: ??? (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/memcheck-amd64-linux)<br>
| ==1533==    by 0x580F5FD4: ??? (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/memcheck-amd64-linux)<br>
| <br>
| sched status:<br>
|   running_tid=1<br>
| <br>
| Thread 1: status = VgTs_Runnable (lwpid 1533)<br>
| ==1533==    at 0x483BE63: operator new(unsigned long) (in<br>
| /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)<br>
| ==1533==    by 0x6E92D3C: void std::__cxx11::basic_string<char,<br>
| std::char_traits<char>, std::allocator<char> >::_M_construct<char<br>
| const*>(char const*, char const*, std::forward_iterator_tag) (in<br>
| /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)<br>
| ==1533==    by 0x1C1B2377: C_glcm_textures_helper2(Rcpp::Vector<13,<br>
| Rcpp::PreserveStorage>, Rcpp::Vector<13, Rcpp::PreserveStorage>, int,<br>
| Rcpp::Vector<13, Rcpp::PreserveStorage>, Rcpp::String, unsigned long,<br>
| unsigned long) (glcm_cpp_functions.cpp:221)<br>
| ==1533==    by 0x1C1A098D: _GLCMTextures_C_glcm_textures_helper2<br>
| (RcppExports.cpp:94)<br>
| ==1533==    by 0x1F6B01: R_doDotCall (dotcode.c:622)<br>
| ==1533==    by 0x2637C9: bcEval (eval.c:7695)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x240E06: Rf_eval (eval.c:871)<br>
| ==1533==    by 0x246CD6: do_set (eval.c:2990)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x2457DA: do_begin (eval.c:2538)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x244FC9: do_for (eval.c:2420)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x2457DA: do_begin (eval.c:2538)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x244FC9: do_for (eval.c:2420)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x2457DA: do_begin (eval.c:2538)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x253F32: bcEval (eval.c:7107)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x243D9C: R_execMethod (eval.c:2094)<br>
| ==1533==    by 0x8800187: R_dispatchGeneric (methods_list_dispatch.c:1145)<br>
| ==1533==    by 0x2B15F4: do_standardGeneric (objects.c:1285)<br>
| ==1533==    by 0x253DB3: bcEval (eval.c:7096)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x253F32: bcEval (eval.c:7107)<br>
| ==1533==    by 0x240653: Rf_eval (eval.c:748)<br>
| ==1533==    by 0x243223: R_execClosure (eval.c:1918)<br>
| ==1533==    by 0x242EFD: Rf_applyClosure (eval.c:1844)<br>
| ==1533==    by 0x240E06: Rf_eval (eval.c:871)<br>
| ==1533==    by 0x246CD6: do_set (eval.c:2990)<br>
| ==1533==    by 0x240A8C: Rf_eval (eval.c:823)<br>
| ==1533==    by 0x28EF5E: Rf_ReplIteration (main.c:264)<br>
| ==1533==    by 0x28F157: R_ReplConsole (main.c:316)<br>
| ==1533==    by 0x290BC0: run_Rmainloop (main.c:1130)<br>
| ==1533==    by 0x290BDA: Rf_mainloop (main.c:1137)<br>
| ==1533==    by 0x16F74B: main (Rmain.c:29)<br>
| client stack range: [0x1FFEED3000 0x1FFF000FFF] client SP: 0x1FFEFF35F0<br>
| valgrind stack range: [0x1008FE3000 0x10090E2FFF] top usage: 12336 of<br>
| 1048576<br>
| <br>
| <br>
| Note: see also the FAQ in the source distribution.<br>
| It contains workarounds to several common problems.<br>
| In particular, if Valgrind aborted or crashed after<br>
| identifying problems in your program, there's a good chance<br>
| that fixing those problems will prevent Valgrind aborting or<br>
| crashing, especially if it happened in m_mallocfree.c.<br>
| <br>
| If that doesn't help, please report this bug to: <a href="http://www.valgrind.org" rel="noreferrer" target="_blank">www.valgrind.org</a><br>
| <br>
| In the bug report, send all the above text, the valgrind<br>
| version, and what OS and version you are using.  Thanks.<br>
| <br>
| On Mon, Dec 13, 2021 at 8:15 AM Alexander Ilich <<a href="mailto:ailich@mail.usf.edu" target="_blank">ailich@mail.usf.edu</a>> wrote:<br>
| <br>
| > Hi, I'm upgrading one of my R packages to rely on the terra package<br>
| > instead of the raster package for the handling of spatial raster data.<br>
| > Previously when relying on the raster package I had to convert the data to<br>
| > a matrix and send it to C++ to loop through the cells manually, but with<br>
| > the new features in the terra package I can supply a C++ function that<br>
| > returns multiple values directly to terra::focalCpp to perform focal<br>
| > operations<br>
| > <<a href="https://desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/how-focal-statistics-works.htm" rel="noreferrer" target="_blank">https://desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/how-focal-statistics-works.htm</a>>.<br>
| > I get the same values using both the old and new versions of the functions,<br>
| > but the new version often causes the R session to abort, especially at<br>
| > larger window sizes. For example, a 3x3 or a 3x5 window seems to always<br>
| > run, but a 3x7 window will often cause the R session to abort. However,<br>
| > when it doesn't, I get the correct values. Functions followed by 2 are the<br>
| > terra versions of the function. By commenting out things and rebuilding I<br>
| > was able to determine the line that causes the crash in the terra version<br>
| > is "NumericMatrix curr_GLCM = C_make_glcm(curr_window, n_levels, shift,<br>
| > na_opt); //Tabulate the GLCM"; however, this line is also included in the<br>
| > raster version of the function so I'm not sure why this would happen. Any<br>
| > help would be greatly appreciated. Here is the github repository<br>
| > <<a href="https://github.com/ailich/GLCMTextures/tree/terra" rel="noreferrer" target="_blank">https://github.com/ailich/GLCMTextures/tree/terra</a>>, and I've added some<br>
| > sample code below to illustrate the issue.<br>
| ><br>
| > Thanks,<br>
| > Alex<br>
| ><br>
| > install.packages('raster', repos='<a href="https://rspatial.r-universe.dev" rel="noreferrer" target="_blank">https://rspatial.r-universe.dev</a>')<br>
| > #install development version of raster<br>
| > install.packages('terra', repos='<a href="https://rspatial.r-universe.dev" rel="noreferrer" target="_blank">https://rspatial.r-universe.dev</a>')<br>
| > #install development version of terra<br>
| ><br>
| > remotes::install_github("ailich/GLCMTextures", ref = "terra") #Install<br>
| > branch of my package testing terra versions of functions<br>
| ><br>
| > library(terra)<br>
| > library(raster)<br>
| > library(GLCMTextures)<br>
| ><br>
| > r1a<- raster::raster(volcano)<br>
| > r2a<- glcm_textures(r1a, w=c(3,7), n_levels = 16, quantization = "equal<br>
| > prob", shift=c(0,1))<br>
| ><br>
| > r1b<- terra::rast(volcano)<br>
| > r2b<- glcm_textures2(r1b, w=c(3,7), n_levels = 16, quantization = "equal<br>
| > prob", shift=c(0,1)) #Often leads to Rsession Aborted<br>
| ><br>
| > all.equal(values(r2a),values(r2b)) #TRUE<br>
| ><br>
| ><br>
| ><br>
| > #System Information<br>
| > #OS: Windows 10<br>
| > R.version<br>
| > # platform       x86_64-w64-mingw32<br>
| > # arch           x86_64<br>
| > # os             mingw32<br>
| > # system         x86_64, mingw32<br>
| > # status<br>
| > # major          4<br>
| > # minor          0.4<br>
| > # year           2021<br>
| > # month          02<br>
| > # day            15<br>
| > # svn rev        80002<br>
| > # language       R<br>
| > # version.string R version 4.0.4 (2021-02-15)<br>
| > # nickname       Lost Library Book<br>
| ><br>
| > packageVersion("terra")<br>
| > # ‘1.5.2’<br>
| > packageVersion("raster")<br>
| > # ‘3.5.10’<br>
| > packageVersion("Rcpp")<br>
| > # ‘1.0.7’<br>
| > packageVersion("RcppArmadillo")<br>
| > # ‘0.10.7.3.0’<br>
| > _______________________________________________<br>
| > Rcpp-devel mailing list<br>
| > <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
| > <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
| _______________________________________________<br>
| Rcpp-devel mailing list<br>
| <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
| <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
-- <br>
<a href="https://dirk.eddelbuettel.com" rel="noreferrer" target="_blank">https://dirk.eddelbuettel.com</a> | @eddelbuettel | <a href="mailto:edd@debian.org" target="_blank">edd@debian.org</a><br>
</blockquote></div>
</blockquote></div>
_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a></blockquote></div>
</blockquote></div>