mapply error with Math (S4 group generic)
Problem solved. Martin Morgan pointed out to me that the error occurs because in the method in raster I used, to get the function name which I need for branching, the naive approach: funname <- as.character(sys.call(sys.parent())[[1]]) from the code of callGeneric Martin deduced that I should instead use funname <- .Generic That indeed made the problem go away. Best, Robert
On Wed, Feb 13, 2013 at 4:35 PM, Robert J. Hijmans <r.hijmans at gmail.com> wrote:
I get an error when using self-defined (not standard) functions with mapply with S4 objects from the raster package that I develop: "Error in as.character(sys.call(sys.parent())[[1]]) : cannot coerce type 'closure' to vector of type 'character'". Does anyone understand why? The problem is illustrated below. Thanks, Robert
# First a general example that works
setClass('Foo',representation (value = 'numeric'))
setMethod("Math", signature(x='Foo'),function(x){ x at value <-
callGeneric(x at value); x } )
[1] "Math"
f <- new('Foo')
f at value = 1
ff <- list(f,f)
e1 <- exp(f)
e2 <- mapply(exp, ff)
e3 <- mapply(function(x)exp(x), ff)
# Now for the raster package that also has the Math group generic implemented
library(raster)
Loading required package: sp raster 2.0-41 (21-December-2012)
r <- raster(ncol=3, nrow=3) r[] <- 1:9 rr <- list(r,r) g1 <- exp(r) g2 <- mapply(exp, rr) g3 <- mapply(function(x)exp(x), rr)
Error in as.character(sys.call(sys.parent())[[1]]) : cannot coerce type 'closure' to vector of type 'character'
# For this simple example we could use lapply, and that works fine:
gl <- lapply(rr, function(x)exp(x))
# but the below works fine (log is defined as a single method, overriding its definition in the group generic)
g4 <- mapply(function(x)log(x), rr)
# or when combining with methods from group generic Arith:
g5 <- mapply(function(x)log(x*3), rr)
# Yet, I also fond problems with the Summary group generic; similar but different error message.
m1 <- max(rr[[1]], rr[[1]]) m2 <- mapply(max, rr, rr)
Error in as.character(sys.call()[[1L]]) : cannot coerce type 'builtin' to vector of type 'character'
sessionInfo()
R version 2.15.2 (2012-10-26) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] raster_2.0-41 sp_0.9-99 loaded via a namespace (and not attached): [1] grid_2.15.2 lattice_0.20-10 tools_2.15.2