R嵌套for循环以编写多个函数并绘制它们

时间:2016-08-08 05:57:47

标签: r function for-loop plot

这是我的数据:

color   a   b
red     3   1.3
blue    9   1.8
purple  13  1.2
green   4   1.1
orange  7   0.9
yellow  6   2.1
brown   7   1.8

对于每一行,我想用以下格式编写一个名为“fun_color”的函数:y = a*(x^b)

(a和b是每行的数据$ a和数据$ b列的值.x是函数的域。)

我假设我应该在下面写一个嵌套的for循环:

for (i in dt$color) 
  {(paste("fun_",i, sep = "")) = function(x)
    for (a in dt$a) 
      {a*x}
    }

然而,我,一个相对的R新手,不能让这个循环工作。

然后,我想在同一个图上绘制这10个方程中的每一个。我想我应该在这里写另一个for循环,比如:

plot(fun_red)
for (i in function_list) {
  plot(i, add=TRUE)}

有任何帮助吗?谢谢!

4 个答案:

答案 0 :(得分:2)

选择一系列x值,并用sapply迭代它们。无需多次调用绘图函数,只需使用matplot即可。

s <- seq(.2,5,by =.2)
matplot(s,t(sapply(s, function(x) dt$a*(x)^dt$b)),
        type = "l", lty = "solid", lwd = 2, col = dt$color, ylab = "y", xlab = "x")

enter image description here

答案 1 :(得分:0)

是的,使用for循环。但是,请使用curve绘制函数。

plot.new()
plot.window(xlim = c(0, 5), ylim = c(0, 200))
for (i in seq_len(nrow(DF))) curve(DF$a[i] * (x ^ DF$b[i]), 
                                   add = TRUE, col = as.character(DF$color[i]),
                                   lwd = 2)
axis(1)  
axis(2)

resulting plot

答案 2 :(得分:0)

以下内容不使用for循环来创建函数,而是使用一个函数,该函数根据作为参数给出的颜色返回不同的函数。这样做的好处是不使用assignget

fun_col <- function(col) {
  a <- dt$a[dt$color == col]
  b <- dt$b[dt$color == col]
  function(x) a*x^b
}

for (col in dt$color) {

  plot(fun_col(col), add = TRUE)

}

答案 3 :(得分:0)

或者,我们可以使用apply而不是for循环来绘制函数。首先,让我们读入数据和绘制值的范围。

dt <- read.table(text="color   a   b
red     3   1.3
blue    9   1.8
purple  13  1.2
green   4   1.1
orange  7   0.9
yellow  6   2.1
brown   7   1.8", header=T)

# vector for x values
x1 <- 0
x2 <- 1
n <- 100
x <- seq(x1, x2, by = ((x2-x1)/n))

然后,我们绘制一个空白空间,其中将绘制函数曲线。请注意,我们计算max.y变量中y轴所需的最大值。

max.y <- dt[which.max(rowSums(dt[,2:3])),2] * (x2 ^ dt[which.max(rowSums(dt[,2:3])),3])

plot(x1, type="n", xlim=c(x1,x2), ylim=c(x1, max.y), xlab="x", ylab="a*(x^b)")

最后,我们根据数据中的规格绘制线条。

apply(dt, 1, FUN=function(dt.row) 
    lines(x, as.numeric(dt.row[2]) * (x ^ as.numeric(dt.row[3])), col=dt.row[1]))

<强>基准

根据Roland&shayaa的评论,这是性能比较。 Roland和shayaa的整个答案被输入到各自的函数中,从x1变量定义开始到nya()函数的所有内容。

library(microbenchmark)
microbenchmark(roland(dt))
Unit: milliseconds
       expr      min      lq    mean   median       uq      max neval
 roland(dt) 18.09634 18.4124 19.2258 18.67313 19.17735 35.42943   100
microbenchmark(shayaa(dt=dt))
Unit: milliseconds
            expr      min       lq     mean   median       uq      max neval
 shayaa(dt = dt) 10.85788 11.04311 11.44358 11.22057 11.51216 18.19182   100
 microbenchmark(nya(dt=dt))
 Unit: milliseconds
          expr      min       lq     mean  median       uq      max neval
  nya(dt = dt) 18.26883 18.61892 19.02823 18.8229 19.18054 25.41353   100

我的结论是,在这种情况下,性能不是一个关键问题。用户可以根据个人喜好选择方法,并使用动态选项(x1,x2,max.y)对其进行修改。