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:jdnew...@dcn.davis.ca.us]
Sent: Friday, September 09, 2016 5:39 PM
To: Steve Kennedy; r-help@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
<skenn...@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@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:<jdnew...@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
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.