Help with functions as arguments
On Feb 12, 2013, at 12:38 AM, Rainer M Krug wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 12/02/13 08:30, Ian Renner wrote:
Hi,
I am trying to write a function which defines some arguments, then uses those arguments as
arguments of other function calls. It's a bit tricky to explain, so a simple example will have
to suffice. I imagine this has a simple solution, but perusing through environments and other
help lists has not helped. Suppose I have two functions:
f1 = function(a) { b = a + 1 b } f2 = function(x, z) { y = x*z -2 y }
I assume that some carriage returns have ben lost and that this is meant:
f1 = function(a) { b = a + 1; b }; f2 = function(x, z) { y = x*z -2; y }
Where I am running into trouble is when I want to call function f1 within function f2: f2(x = 3, z = f1(x)) This returns the error: "Error in f1(x) : object 'x' not found"
Obviously easiest: X <- 3 f2(X=x, Z=f1(X))
I think there was some switching of capitals there, but assume this was meant: X <- 3 f2(x=X, z=f1((X)) Also possible would be:
f2(x, z=f1(x<-3) )
[1] 10 Using f1(x<-3) creates a value of 'x' in the global environment and the result is passed to `f1` (although not as a named argument since f1 is expecting a formal named "b") and then f1(3) is passed to z:
f1(3)
[1] 4
f2(3, 4)
[1] 10
This would seem to be a method of creating mildly obfuscated code, so I'm not really recommending it. I would think the more natural way would be creation of a constrained version of f2
f3 <- function(x) { f2(x, f1(x) }
David. > > Your solution does not work, as the f1(x) is evaluated and the value is passed on to f1, and your > x is an argument and *only in the function f2* available (= in this context *no* assignment). > > I remember something similar, and the solution had to do with eval() and quote() and friends - > i.e. you have to only evaluate f(x) *inside* the function f2 - but unfortunately I do not remember > details. > > Cheers, > > Rainer > > > >> >> I'm not sure how to define environments within the functions so that the just-defined 'x' may >> be passed as an argument to f1 within f2. >> >> Any help would be greatly appreciated! >> >> Ian Renner [[alternative HTML version deleted]] >> David Winsemius Alameda, CA, USA