## A version for R of the example in ## Becker, Chambers & Wilks (1998) pp. 205-211. ## ## Notes: ## ## 1. Because of the difference in scoping rules between R and S it is ## not necessary (and indeed an error) to assign the function in ## frame 1. The function f.check can see the function f because it ## exists in the environment where f is defined. ## ## 2. It is also not necessary (although permissible) to wrap a "list" ## around the function f.check in the .C call. R passes such ## functions through to the underlying C code in "undigested" form. ## Correspondingly, the underlying C code does not need to extract ## the function from the passed "list". file.show(file.path(R.home(), "demos", "dynload", "README")) file.show(file.path(R.home(), "demos", "dynload", "zerofind.c")) dyn.load(file.path(R.home(), "demos", "dynload", paste("zerofind", .Platform$dynlib.ext, sep=""))) zero <- function(f, guesses, tol = 1e-7) { f.check <- function(x) { x <- f(x) if(!is.numeric(x)) stop("Need a numeric result") as.double(x) } z <- .C("zero_find", f.check, ans = as.double(guesses), as.double(tol)) z$ans[1] } cube1 <- function(x) (x^2 + 1) * (x - 1.5) x0 <- zero(cube1, c(0, 5)) print(x0) print(x0, 15)