Hello R users, I encountered a strange problem while writing a package that uses the nlme function. First, I wrote some code that uses the nlme function, and it ran without errors. However, when I tried to put the code into a package, the nlme function was unable to locate a function that was used in the formula. Could it be that nlme is looking in the wrong environment? I would appreciate any suggestions. Below is a reproducible example with the problem. ########### BEGIN EXAMPLE ############## #' Fake package to show nlme error #' @export main_function <- function(x){ library(nlme) result <- nlme(height ~ SSasymp(age, Asym, R0, lrc) + nonlinear_function(age), data = Loblolly, fixed = Asym + R0 + lrc ~ 1, random = Asym ~ 1, start = c(Asym = 103, R0 = -8.5, lrc = -3.3)) result } nonlinear_function <- function(x){ log(x) } ########### END EXAMPLE ############## The above code can be installed as a package and run with the commands library(devtools) library(roxygen2) setwd("C:/test") # or any prefered directory create("testPackage") setwd("./testPackage") document() setwd("..") install("testPackage") main_function() The output is> main_function()Error in eval(expr, envir, enclos) : could not find function "nonlinear_function"> > sessionInfo()R version 3.1.3 (2015-03-09) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 8 x64 (build 9200) locale: [1] LC_COLLATE=English_United States.1252 [2] LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices utils datasets methods [7] base other attached packages: [1] nlme_3.1-120 testPackage_0.0.0.9000 [3] roxygen2_4.1.1 devtools_1.8.0 loaded via a namespace (and not attached): [1] curl_0.8 digest_0.6.8 git2r_0.10.1 [4] grid_3.1.3 lattice_0.20-31 magrittr_1.5 [7] memoise_0.2.1 Rcpp_0.11.6 rversions_1.0.1 [10] stringi_0.4-1 stringr_1.0.0 tools_3.1.3 [13] xml2_0.1.1 Note that if I simply paste main_function and nonlinear_function into the R console, then main_function() runs without errors. Greg [[alternative HTML version deleted]]
On 15/06/2015 8:32 PM, Greg Hather wrote:> Hello R users, > > I encountered a strange problem while writing a package that uses the > nlme function. First, I wrote some code that uses the nlme function, > and it ran without errors. However, when I tried to put the code into > a package, the nlme function was unable to locate a function that was > used in the formula. Could it be that nlme is looking in the wrong > environment? I would appreciate any suggestions. Below is a > reproducible example with the problem.I haven't tested this (I don't use the devtools stuff), but I'd say there are two likely possibilities: 1. nlme() isn't evaluating the formula properly. 2. Your test isn't doing what you think it is doing, because you have a second copy of main_function in your global environment. Assuming you can rule out 2, could you put together a tarball of the package that I could actually run? Duncan Murdoch> > ########### BEGIN EXAMPLE ############## > > #' Fake package to show nlme error > #' @export > > main_function <- function(x){ > library(nlme) > result <- nlme(height ~ SSasymp(age, Asym, R0, lrc) + > nonlinear_function(age), > data = Loblolly, > fixed = Asym + R0 + lrc ~ 1, > random = Asym ~ 1, > start = c(Asym = 103, R0 = -8.5, lrc = -3.3)) > result > } > > nonlinear_function <- function(x){ > log(x) > } > > ########### END EXAMPLE ############## > > The above code can be installed as a package and run with the commands > > library(devtools) > library(roxygen2) > setwd("C:/test") # or any prefered directory > create("testPackage") > setwd("./testPackage") > document() > setwd("..") > install("testPackage") > main_function() > > The output is > >> main_function() > Error in eval(expr, envir, enclos) : > could not find function "nonlinear_function" >> >> sessionInfo() > R version 3.1.3 (2015-03-09) > Platform: x86_64-w64-mingw32/x64 (64-bit) > Running under: Windows 8 x64 (build 9200) > locale: > [1] LC_COLLATE=English_United States.1252 > [2] LC_CTYPE=English_United States.1252 > [3] LC_MONETARY=English_United States.1252 > [4] LC_NUMERIC=C > [5] LC_TIME=English_United States.1252 > attached base packages: > [1] stats graphics grDevices utils datasets methods > [7] base > other attached packages: > [1] nlme_3.1-120 testPackage_0.0.0.9000 > [3] roxygen2_4.1.1 devtools_1.8.0 > loaded via a namespace (and not attached): > [1] curl_0.8 digest_0.6.8 git2r_0.10.1 > [4] grid_3.1.3 lattice_0.20-31 magrittr_1.5 > [7] memoise_0.2.1 Rcpp_0.11.6 rversions_1.0.1 > [10] stringi_0.4-1 stringr_1.0.0 tools_3.1.3 > [13] xml2_0.1.1 > > Note that if I simply paste main_function and nonlinear_function into > the R console, then main_function() runs without errors. > > Greg > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Hi Duncan, I checked the global environment, and it was empty, so I think that rules out the second possibility. I posted a tarball at https://drive.google.com/file/d/0B8hBX90jtuLcaGtOUktqV2V4UUU/view?usp=sharing Thank you for your help! Greg [[alternative HTML version deleted]]
An aside... Just wanted to point out that: fun <- function(x)log(x) can be more simply replaced by: fun <- log Functions in R a full first class objects and can be treated as such. In your example, this is still silly of course, but becomes relevant in function calls where you can do things like myfun <- function( FUN = log,...) { ... something <- FUN(X) ... } Just in case this might be useful to you. Cheers, Bert Bert Gunter "Data is not information. Information is not knowledge. And knowledge is certainly not wisdom." -- Clifford Stoll On Mon, Jun 15, 2015 at 4:32 PM, Greg Hather <ghather at gmail.com> wrote:> Hello R users, > > I encountered a strange problem while writing a package that uses the > nlme function. First, I wrote some code that uses the nlme function, > and it ran without errors. However, when I tried to put the code into > a package, the nlme function was unable to locate a function that was > used in the formula. Could it be that nlme is looking in the wrong > environment? I would appreciate any suggestions. Below is a > reproducible example with the problem. > > ########### BEGIN EXAMPLE ############## > > #' Fake package to show nlme error > #' @export > > main_function <- function(x){ > library(nlme) > result <- nlme(height ~ SSasymp(age, Asym, R0, lrc) + > nonlinear_function(age), > data = Loblolly, > fixed = Asym + R0 + lrc ~ 1, > random = Asym ~ 1, > start = c(Asym = 103, R0 = -8.5, lrc = -3.3)) > result > } > > nonlinear_function <- function(x){ > log(x) > } > > ########### END EXAMPLE ############## > > The above code can be installed as a package and run with the commands > > library(devtools) > library(roxygen2) > setwd("C:/test") # or any prefered directory > create("testPackage") > setwd("./testPackage") > document() > setwd("..") > install("testPackage") > main_function() > > The output is > > > main_function() > Error in eval(expr, envir, enclos) : > could not find function "nonlinear_function" > > > > sessionInfo() > R version 3.1.3 (2015-03-09) > Platform: x86_64-w64-mingw32/x64 (64-bit) > Running under: Windows 8 x64 (build 9200) > locale: > [1] LC_COLLATE=English_United States.1252 > [2] LC_CTYPE=English_United States.1252 > [3] LC_MONETARY=English_United States.1252 > [4] LC_NUMERIC=C > [5] LC_TIME=English_United States.1252 > attached base packages: > [1] stats graphics grDevices utils datasets methods > [7] base > other attached packages: > [1] nlme_3.1-120 testPackage_0.0.0.9000 > [3] roxygen2_4.1.1 devtools_1.8.0 > loaded via a namespace (and not attached): > [1] curl_0.8 digest_0.6.8 git2r_0.10.1 > [4] grid_3.1.3 lattice_0.20-31 magrittr_1.5 > [7] memoise_0.2.1 Rcpp_0.11.6 rversions_1.0.1 > [10] stringi_0.4-1 stringr_1.0.0 tools_3.1.3 > [13] xml2_0.1.1 > > Note that if I simply paste main_function and nonlinear_function into > the R console, then main_function() runs without errors. > > Greg > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]