2017-08-14 122 views
0

這是一個基本的問題,當然,也有很多在谷歌的例子..但我就是不明白這個小一堆代碼..Sapply功能混淆了我

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是一種將矢量或列表或元素的每個元素應用於主體的函數。在這種情況下,這是V. 讓我困惑的一點是「0:3」部分(這似乎是VK的元素數量)和函數%*%VK的結尾。當我用不同的數字對我自己做同樣的事情時,VK被總結出來,然後用作exp(exp(V^x))的係數。但在這種情況下,這是沒有意義的。 此外:通過谷歌搜索,我總是讀到sapply產生的向量。由於上面的代碼生成一個繪圖,這是一個2D向量作爲結果?

+1

'sap ply()'運行'V^0',然後'V^1',然後'V^2',然後'V^3',然後將結果放入矩陣。然後'%*%'將該矩陣乘以'VK'。忘記谷歌一分鐘,並通過'help(sapply)'閱讀官方的R文檔。 –

+0

@RichScriven Ahh ..非常感謝!這是非常unvisceral .. :)你也可以請告訴我爲什麼這隻適用於當我要求「(..sapply(0:3,..)」而不是「(..sapply(0:2,..)」)或者不同的東西? – Ben

+0

因爲'length(0:2)'和'length(VK)'是不一樣的。對於'%*%',矩陣必須符合 –

回答

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^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") 
+0

謝謝,我現在完全明白了! – Ben

1

你正在一行中做多件事。我想你會在1行的不同部分迷失,就像同時發生5件事一樣。

plot(x = V, exp(exp(sapply(0:3, function(x) V^x) %*% VK)), type = "l"); grid() 

首先,主要部分是plot(x, y, type = "l")。這只是對矢量y繪製矢量x。在你的情況下,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 -loop。它由兩種成分組成:part1part2

part1是一個具有多個元素的對象,如data.frame或vector(這裏:part1等於c(0, 1, 2, 3))。該對象內的元素用作part2的參數。在這種特殊情況下,您將自定義函數定義爲part2。在此自定義函數中,您將V的權力設置爲x,並將結果與​​矩陣VK相乘。棘手的部分是x等於第一次迭代中的0,第二次迭代中的1,以及最後一次中的3。你只是通過0:3,這是你的sapply(part1, part2)part1

因此inside_of_y現在包含4個元素。然後我們繼續繪製xyplot(x, y)函數。

+0

非常感謝您的好評和詳細的解釋! – Ben

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是儘量不返回一個矩陣失敗過成功者,如果它不能返回一個向量