这是一个基本问题,当然,google中有很多例子..但我只是不明白这一小段代码..
V <- seq(50, 350, by = 1)
> VK
Voltage^0 Voltage^1 Voltage^2 Voltage^3
-1.014021e+01 9.319875e-02 -2.738749e-04 2.923875e-07
plot(x = V, exp(exp(sapply(0:3, function(x) V^x) %*% VK)), type = "l"); grid()
在尝试使用该功能本身后,我试图支持这一点,但是......我不能将我的想法应用到这个特定的行。 据我所知,我相信我可以说:sapply是一个函数,它为一个向量或列表的每个元素或类似的东西应用了body。在这种情况下,这是V. 令我困惑的一点是“0:3”部分(似乎是VK的元素数量)和函数%*%VK的结尾。当我自己做同样的事情,不同的数字比VK总结,然后用作exp(exp(V ^ x))的系数。但在这种情况下这没有任何意义。 此外:通过谷歌搜索我总是阅读sapply产生一个向量。由于上面的代码生成了一个图,这是一个2D矢量作为结果?
答案 0 :(得分:1)
你在一行中做了很多事。我想你在1行的不同部分迷路了,就像同时发生了5件事。
plot(x = V, exp(exp(sapply(0:3, function(x) V^x) %*% VK)), type = "l"); grid()
首先,主要部分是plot(x, y, type = "l")
。这只是针对向量x
绘制了一个向量y
。在您的情况下,y
为exp(exp(sapply(0:3, function(x) V^x) %*% VK))
。
编写代码的更简单,更漂亮的方法就是:
inside_of_y <- sapply(0:3, function(x){ V^x %*% VK })
y_variable <- exp(exp(inside_of_y))
plot(x = V, y = y_variable, type = "l")
grid()
第一行可能还在惹你一番。从本质上讲,sapply
只是一个for
- 循环。它由两部分组成:part1
和part2
。
part1
是一个具有多个元素的对象,如data.frame或vector(此处:part1
等于c(0, 1, 2, 3)
)。此对象中的元素用作part2
的参数。在这种特殊情况下,您将自定义函数定义为part2
。在此自定义函数中,您将V
置于x
的幂,并将结果乘以矩阵VK
。棘手的部分是x
在第一次迭代中等于0
,在第二次迭代中等于1
,在最后一次迭代中等于3
。您刚刚浏览了0:3
part1
sapply(part1, part2)
的{{1}}。
所以inside_of_y
现在包含4个元素。然后,我们继续使用x
函数绘制y
与plot(x, y)
的关系。
答案 1 :(得分:1)
sapply(0:3, function(x) V^x)
> sapply(0:3, function(x) V^x)
[,1] [,2] [,3] [,4]
[1,] 1 50 2500 125000
[2,] 1 51 2601 132651
[3,] 1 52 2704 140608
如评论中所述,sapply会生成一个矩阵(301x4
),其中每列代表V^0
,V^1
,V^2
和V^3
。然后,它乘以VK(4x1
)。这将生成一个向量(301x1
)。
> sapply(0:3, function(x) V^x) %*% VK
[,1]
[1,] -6.128411312
[2,] -6.060636871
[3,] -5.993320708
完成这些步骤后,将指数函数应用于新矢量两次。这个新的向量包含你的情节的y值。
如果你想申请“(..sapply(0:2,..)”而不是“(..sapply(0:3,..)”,那么将VK改为:
VK <- c(-1.014021e+01, 9.319875e-02, -2.738749e-04)
names(VK) <- c( "Voltage^0", "Voltage^1", "Voltage^2")
答案 2 :(得分:1)
仅用于说明,这是代码在转换为for
循环时的样子。
V <- seq(50, 350, by = 1)
VK <- c("Voltage^0" = -1.014021e+01,
"Voltage^1" = 9.319875e-02,
"Voltage^2" = -2.738749e-04,
"Voltage^3" = 2.923875e-07)
coef <- matrix(0, ncol = 4, nrow = length(V))
for(x in 0:3){
coef[, x + 1] <- V^x
}
Y <- exp(exp(coef %*% VK))
plot(V, Y, type = "l"); grid()
这是有效的,因为sapply
是一个过度成就者,如果它不能返回一个向量,它会通过返回一个矩阵来尝试不失败。