这是我的数据:
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)}
有任何帮助吗?谢谢!
答案 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")
答案 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)
答案 2 :(得分:0)
以下内容不使用for循环来创建函数,而是使用一个函数,该函数根据作为参数给出的颜色返回不同的函数。这样做的好处是不使用assign
和get
。
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)对其进行修改。