[R] Using sapply on a two argument function

Steven Worthington steven.worthington at gmail.com
Thu Feb 11 23:36:00 CET 2010


Dear R users,

I have a function (simplified here) that accepts two arguments and performs
various calculations:

foo <- function(y, x) {
		a <- y*sqrt(x)
		b <- a+2
		c <- a*b
		return(c)
	}

If I call the function as follows I get the result I desire:

> foo(.1, 1:12)
 [1] 0.2100000 0.3028427 0.3764102 0.4400000 0.4972136 0.5498979 0.5991503
0.6456854 0.6900000 0.7324555 0.7733250
[12] 0.8128203

or:

> foo(.2, 1:12)
 [1] 0.4400000 0.6456854 0.8128203 0.9600000 1.0944272 1.2197959 1.3383005
1.4513708 1.5600000 1.6649111 1.7666499
[12] 1.8656406

what i'd like to do is run though a number of iterations of 'y' - say from
.1 to 1 - for a range of x values (1:12 here, though in my actual code
1:100). I've had a go at automating this using sapply. The structure of the
data.frame I create looks fine, but the content doesn't match my
expectations. What I want is a data.frame that has the above vectors as
columns (so, column 1 = the values for y=.1, column 2 = values for y=.2
etc... and the rows are the values of x for any given y). Here is my attempt
at a solution, if anyone can point out what I'm doing wrong or suggest a
simpler method, i'd be most grateful.

best,

Steve


# ------------------------------------------------
calc <- function(w,s) {

	foo <- function(y=seq(.1, s/10, by=.1), x=1:w) {
		a <- y*sqrt(x)
		b <- a+2
		c <- a*b
		return(c)
	}
	
	k <- function(s=10) {
		n <- 1:s
		m <- data.frame(1:s)
		m <- sapply(n, foo)
		rownames(m) <- 1:10
		colnames(m) <- seq(.1, s/10, by=.1)
		return(m)
	} 

result <- k(s)
return(result)
}
# ------------------------------------------------
calc(12, 10)

         0.1      0.2       0.3       0.4       0.5       0.6      0.7     
0.8      0.9         1
1   3.000000  8.00000  15.00000  24.00000  35.00000  48.00000  63.0000 
80.0000  99.0000  120.0000
2   4.828427 13.65685  26.48528  43.31371  64.14214  88.97056 117.7990
150.6274 187.4558  228.2843
3   6.464102 18.92820  37.39230  61.85641  92.32051 128.78461 171.2487
219.7128 274.1769  334.6410
4   8.000000 24.00000  48.00000  80.00000 120.00000 168.00000 224.0000
288.0000 360.0000  440.0000
5   9.472136 28.94427  58.41641  97.88854 147.36068 206.83282 276.3050
355.7771 445.2492  544.7214
6  10.898979 33.79796  68.69694 115.59592 174.49490 245.39388 328.2929
423.1918 530.0908  648.9898
7  12.291503 38.58301  78.87451 133.16601 201.45751 283.74902 380.0405
490.3320 614.6235  752.9150
8  13.656854 43.31371  88.97056 150.62742 228.28427 321.94113 431.5980
557.2548 698.9117  856.5685
9  15.000000 48.00000  99.00000 168.00000 255.00000 360.00000 483.0000
624.0000 783.0000  960.0000
10 16.324555 52.64911 108.97367 185.29822 281.62278 397.94733 534.2719
690.5964 866.9210 1063.2456
11 17.633250 57.26650 118.89975 202.53300 308.16625 435.79950 585.4327
757.0660  950.6992 1166.3325
12 18.928203 61.85641 128.78461 219.71281 334.64102 473.56922 636.4974
823.4256 1034.3538 1269.2820

-- 
View this message in context: http://n4.nabble.com/Using-sapply-on-a-two-argument-function-tp1477883p1477883.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list