Or you could just call the function directly:

f = (x,y,z)->x+y+z^2
let x=3, y=4, z=5
   f(x,y,z)
end

or

f((x,y,z)...)

or

f((1,2,3)...)



On Sun, Feb 2, 2014 at 10:59 AM, Johan Sigfrids <[email protected]>wrote:

> Can't you just do this with apply? Something like this:
>
> f = (x, y, z) -> x + y + z^2
> let x=3, y=4, z=5
>     apply(f, x, y, z)
> end
>
>
> On Sunday, February 2, 2014 5:47:36 PM UTC+2, Walking Sparrow wrote:
>>
>> Let me clarify a little bit. My question is actually the following:
>>
>> In R, one can do something like
>>
>> > f <- function(x1, x2, x3, x4, x5, x6) { some expressions that you like
>> to use }
>> > evaluate.at <- list(x1 = 2, x2 = 2.3, x3 = 2, x4 = 1.2, x5 = 3.4, x6 =
>> 5.6)
>> > do.call(f, evaluate.at) # get the value
>>
>> "do.call" can accept any valid function, and a list of variable values.
>> There is no restriction to the function or the number of variables.
>> Sometimes this is very useful.
>>
>> How do we do similar things in Julia? Does Julia have a function or macro
>> similar to "do.call"?
>>
>> On Sunday, February 2, 2014 4:09:05 AM UTC-8, Mauro wrote:
>>>
>>> I don't quite comprehend your problem, so maybe this doesn't help.  But
>>> as far as I can tell, there is no need for macros:
>>>
>>> Just define your function as a normal function, which can be evaluated
>>> for any (x,z):
>>>
>>> julia> f(x,z) = x + x*z + log(sin(x) + 2) * log(cos(z) + 2)
>>> f (generic function with 1 method)
>>> julia> x0 = 2.3; z0 = 1.4;
>>> julia> f(x0,z0)
>>> 6.302488546391614
>>>
>>> For the first step: use automatic differentiation on the function in
>>> question.  The package https://github.com/scidom/DualNumbers.jl can do
>>> this:
>>>
>>> julia> using DualNumbers
>>> julia> xdu = dual(x0,1)
>>> 2.3 + 1.0du
>>>
>>> # this gives (f(x0,z0), \partial f / \partial x at (x0,z0)) :
>>> julia> f(xdu,z)
>>> 6.302488546391614 + 2.2120074784516013du
>>>
>>> julia> zdu = dual(z,1)
>>> 1.4 + 1.0du
>>> # this gives (f(x0,z0), \partial f / \partial z at (x0,z0)) :
>>> julia> f(x,zdu)
>>> 6.302488546391614 + 1.8413102782559223du
>>>
>>> (double check that the derivatives are right but I think that is how it
>>> should work)
>>>
>>> On Sat, 2014-02-01 at 23:42, [email protected] wrote:
>>> > You are right about that I have an R background. What I am trying to
>>> do is
>>> > to evaluate a function given by the user. For example,
>>> >
>>> > I want to write a function that can compute the marginal effects of a
>>> > linear or logistic model. For simplicity, let's just use linear
>>> regression.
>>> > If the user did a linear regression using the following model (I am
>>> using
>>> > the formula syntax from R)
>>> >
>>> > y ~ x + z + sin(x) * sin(z) for the data set my_data, which has three
>>> > columns x, y, and z
>>> >
>>> > Then the marginal effects at the mean are computed like this: First,
>>> > compute the first derivative of 1+ x + z + sin(x) * sin(z). This can
>>> be
>>> > done in R using the function "deriv" to get the expression of the
>>> first
>>> > derivative. In the second step, I need to substitute the mean values
>>> of  x
>>> > and z into the result of the first step. An example of this would be
>>> the
>>> > "margins" function in the R package "PivotalR"
>>> > (http://cran.r-project.org/web/packages/PivotalR/ and
>>> > https://github.com/gopivotal/PivotalR)
>>> >
>>> > Right now, I have no idea how to do the first step in Julia. But that
>>> is
>>> > OK, because I just started learning Julia.
>>> >
>>> > Now my question is in the second step. The user can use any complex
>>> > expressions in the linear regression like y ~ x + x*z + log(sin(x) +
>>> 2) *
>>> > log(cos(z) + 2), and the data set my_data and formula can have any
>>> number
>>> > of variables like x1, x2, ...., x1000. So when you write the code for
>>> the
>>> > value substitution in the second step, you cannot know which function
>>> and
>>> > what variables you will have.
>>> >
>>> > So in Julia or R, I need a function or macro F(f, [....]) that does
>>> this:
>>> > given a function f, whose format is the input from the user, and a set
>>> of
>>> > variable values [...], whose number and names are also the input from
>>> the
>>> > user, F(f, [...]) returns the value of f evaluated at the values
>>> [...]. For
>>> > example, the user inputs
>>> >
>>> > f = 1 + z + cos(x)*log(2+cos(z))/(2+sin(x))
>>> >
>>> > and [x = 2.3, z = 1.4],
>>> >
>>> > F should return the value of f evaluated at x = 2.3 and z = 1.4.
>>> >
>>> > This can be done in R, see "margins" function in PivotalR, which
>>> actually
>>> > does big data computation in-database. The problem is how to do the
>>> same
>>> > thing in Julia?
>>> >
>>> > Hope my explanation makes my question clearer.
>>> >
>>> > On Saturday, February 1, 2014 2:35:38 PM UTC-8, Jameson wrote:
>>> >>
>>> >> You need to provide more detail on what you are trying to do with
>>> this.
>>> >> You seem
>>> >> to be confusing several concepts involving the usage of expressions,
>>> >> macros, and functions. I can't tell if you are trying to write
>>> special
>>> >> syntax, or are just unaware of anonymous functions:
>>> >>
>>> >> Mostly, why is :(sin(x) + cos(y) * sin(z)) an expression, and not a
>>> >> function? It seems like you perhaps have an R background?
>>> >>
>>> >> f(x,y,z) = (sin(x) + cos(y) * sin(z))
>>> >> f(1,2,3)
>>> >>
>>> >> On Sat, Feb 1, 2014 at 12:04 PM, Walking Sparrow <[email protected]
>>> <javascript:>>
>>> >> wrote:
>>> >> > So the real question is how to generate a code block like this
>>> >> >
>>> >> > quote
>>> >> >     x = 2
>>> >> >     y = 3
>>> >> >     .....
>>> >> >     x + y + ....
>>> >> > end
>>> >> >
>>> >> > Need to embed a for loop inside the macro definition?
>>> >> >
>>> >> >
>>> >> >
>>> >> > On Saturday, February 1, 2014 8:52:30 AM UTC-8, Walking Sparrow
>>> wrote:
>>> >> >>
>>> >> >> Please forgive me if this is a stupid question. Suppose I have an
>>> >> >> expression
>>> >> >>
>>> >> >> :(sin(x) + cos(y) * sin(z))
>>> >> >>
>>> >> >> and the values of x, y, z.
>>> >> >>
>>> >> >> How can I write a macro that can substitute the values of x, y, z
>>> into
>>> >> the
>>> >> >> above expression? The number of values that I want to substitute
>>> >> depends on
>>> >> >> the actual use cases and thus is unknown.
>>> >> >>
>>> >> >> I wrote a function that can do this
>>> >> >>
>>> >> >> function substitute(expr::Expr, vals::Array{Expr,1})
>>> >> >>     for i = 1:length(vals)
>>> >> >>         @eval $(vals[i])
>>> >> >>     end
>>> >> >>     @eval $expr
>>> >> >> end
>>> >> >>
>>> >> >> x = 10
>>> >> >> y = 23
>>> >> >>
>>> >> >> substitute(:(x+y), [:(x = 2), :(y = 3)])
>>> >> >>
>>> >> >> x
>>> >> >> y
>>> >> >>
>>> >> >> But if you run the above code, you will see that the values of
>>> global x
>>> >> >> and y are changed, which is not what I intend to do. This is
>>> because
>>> >> "eval"
>>> >> >> does the evaluation in the global scope. Besides, I think it is a
>>> bad
>>> >> coding
>>> >> >> pattern to use eval and it is slow.
>>> >> >>
>>> >> >> It would be better if this can be done using macro. But I have no
>>> idea
>>> >> >> about how to do this.
>>> >>
>>>
>>> --
>>> Sent with my mu4e
>>>
>>>

Reply via email to