Sapply功能让我感到困惑

时间:2017-08-14 18:19:48

标签: r

这是一个基本问题,当然,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矢量作为结果?

3 个答案:

答案 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。在您的情况下,yexp(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 - 循环。它由两部分组成:part1part2

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函数绘制yplot(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^0V^1V^2V^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是一个过度成就者,如果它不能返回一个向量,它会通过返回一个矩阵来尝试不失败。