[R] Apply a multi-variable function to a vector

Stephen Kennedy stevek9123 at gmail.com
Sat Sep 10 14:15:20 CEST 2016


Thanks.  I have gotten some replies.  One problem was that I was not
passing the names of the vectors to expand.grid.  I didn't think I had to
do that and that caused problems with do.call.

I wanted to just define the vectors of variables values, the function,
func, and then pass that to my.outer.

I was using A <- c( ... )

Then, expand.grid(A, etc.) with do.call and as.list and without the names
use in 'fund', there was an error.  I didn't think it would matter what
names I used in defining the function.

Thanks very much.  I think I have some good alternatives that all work.

Steve


On Sat, Sep 10, 2016 at 1:29 AM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us>
wrote:

> Not sure I understand what you really want, if you have found ways to
> accomplish what you want but are not satisfied with them. That is one
> reason why keeping the mailing list involved (by reply-all) is good for
> you. From my end, I don't do one-on-one support online, and may not be able
> to carry on a thread to the end if I get busy.
>
> Your concept of a generalized outer function sounds to me like:
>
> myfunc <- function( A, B, C ) {
>  A * B + C
> }
>
> gouter <- function( FUN, ... ) {
>  args <- list( ... )
>  DF <- do.call( expand.grid, args )
>  array( data = do.call( FUN, DF )
>       , dim = sapply( args, FUN=length )
>       , dimnames = args
>       )
> }
>
> gouter( myfunc, A = 1:3, B=2:6, C=3:4 )
> # , , C = 3
> #
> #    B
> # A   2  3  4  5  6
> #   1 5  6  7  8  9
> #   2 7  9 11 13 15
> #   3 9 12 15 18 21
> #
> # , , C = 4
> #
> #    B
> # A    2  3  4  5  6
> #   1  6  7  8  9 10
> #   2  8 10 12 14 16
> #   3 10 13 16 19 22
>
> I generally just tack on columns to the expand.grid result... I almost
> never have a need for multidimensional arrays.
>
> On Fri, 9 Sep 2016, Steve Kennedy wrote:
>
> Hello,
>>
>> Abstraction is what I want.  I'm actually looking to do something more
>> complicated.  The functions do.call, and as.list get me most of the way
>> there, but there is something I'm missing ...
>>
>> My eventual goal is to produce a multi-dimensional version of 'outer'.
>> Like my.outer(func, a_vec, b_vec, c_vec, ..), where the function of the
>> variables 'a', 'b', 'c', etc. would be applied to the vectors from the
>> outer product of the vectors of values for each variable.
>>
>> I wanted to use expand.grid (does require reshaping the output).  Using
>> temps = c(40,50,60) and times = c(1:5), this doesn't quite seem to work:
>>
>>   apply(expand.grid(temps,times), 1, function(a) do.call(func2,
>> as.list(a)))
>>
>> although this does work:
>>
>>   do.call(func2, as.list(c(10, 121)))
>>
>> And, this also works:
>>
>>  apply(expand.grid(temps,times), 1, function(a) do.call("+", as.list(a)))
>>
>> There is some subtlety here I don't understand.
>>
>> Thanks,
>>
>> Steve
>>
>> -----Original Message-----
>> From: Jeff Newmiller [mailto:jdnewmil at dcn.davis.ca.us]
>> Sent: Friday, September 09, 2016 5:39 PM
>> To: Steve Kennedy; r-help at r-project.org
>> Subject: Re: [R] Apply a multi-variable function to a vector
>>
>> Your architecture has a bad smell to me. For one thing you are mixing
>> different units in the same vector but should be putting multiple instances
>> of the same variable into one vector. Lists of vectors (data frames) are
>> typically used when multiple variables need to be grouped.
>>
>> Another problem is that you are constraining the names of the variables
>> you pass to the function to be named the same as they are inside the
>> function. This really limits your use of those functions.
>>
>> There really is too much abstraction going on here.
>> --
>> Sent from my phone. Please excuse my brevity.
>>
>> On September 9, 2016 12:44:52 PM PDT, Steve Kennedy
>> <SKennedy at AnikaTherapeutics.com> wrote:
>>
>>> Hello,
>>>
>>> I would like to define an arbitrary function of an arbitrary number of
>>> variables, for example, for 2 variables:
>>>
>>> func2 <- function(time, temp) time + temp
>>>
>>> I'd like to keep variable names that have a meaning in the problem
>>> (time and temperature above).
>>>
>>> If I have a vector of values for these variables, for example in the
>>> 2-d case, c(10, 121), I'd like to apply my function (in this case
>>> func2) and obtain the result. Conceptually, something like,
>>>
>>> func2(c(10,121))
>>>
>>> becomes
>>>
>>> func2(10,121)
>>>
>>> Is there a simple way to accomplish this, for an arbitrary number of
>>> variables?  I'd like something that would simply work from the
>>> definition of the function.  If that is possible.
>>>
>>> Thanks,
>>>
>>> Steve Kennedy
>>>
>>> CONFIDENTIALITY NOTICE: This e-mail message, including
>>> a...{{dropped:11}}
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> http://cp.mcafee.com/d/k-Kr6x0g6hASyMepov78FI6XCQXLK3AnCrFCQXLK3AnCnAPq
>>> tTT1ObPdSjqaby8VMsUyYrEl-4fgb0HoiaXcDYtmZKsHkVsTI95tCj-eHuTelGsKrpYwCOw
>>> evW_ccnpuKNRXBQQT1TfcFzCnTeEyCJtdmXP_axVZicHs3jq9JcTvANOoVcsCej76XCOsVH
>>> kiPajSvvcCatoDwCHIcfBisEeRO9sDVWNIhgxVxmhUagJ3AdcOFRJVKxJBxdcS2_id41Fr1
>>> pFtd40wIIumd46Cy1lI-syVDoOQwvVEwtrxqsGMd44WCy3jh0p-QWNdLECZzL1
>>> PLEASE do read the posting guide
>>> http://cp.mcafee.com/d/5fHCMUp418SyMepov78FI6XCQXLK3AnCrFCQXLK3AnCnAPqt
>>> TT1ObPdSjqaby8VMsUyYrEl-4fgb0HoiaXcDYtmZKsHkVsTI95tCj-eHuTelGsKrpYwCOwe
>>> vW_ccnpuKNRXBQQT1TfcFzCnTeEyCJtdmXP_axVZicHs3jqpJcTvANOoVcsCej76XCM0gbb
>>> HhG8_qv00smHisE4iV5Ki7Y3zoyx3P2IzMkxq78qpBjHrPt3rb2qpI5-Aq83iS2PiWq811p
>>> oYIq8dd42HpYV5PeNBF0_Ph0WT2QVlwq89Rd46Cy0PZFRyrvhd_2KV
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>> CONFIDENTIALITY NOTICE: This e-mail message, including any attachments,
>> contains information belonging to Anika Therapeutics, Inc. and is for the
>> sole use of the intended recipient(s) and may contain confidential,
>> proprietary, copyrighted and privileged information. Any unauthorized
>> review, use, disclosure, distribution or copying is strictly prohibited. If
>> you are not the intended recipient, please contact the sender by reply
>> e-mail and destroy all copies of the original message immediately.
>>
>>
> ------------------------------------------------------------
> ---------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live
> Go...
>                                       Live:   OO#.. Dead: OO#..  Playing
> Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
> ------------------------------------------------------------
> ---------------
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list