在將矩陣管道輸入時,我得到了一個意想不到的結果,as.data.frame并且可以使用一些智慧來解釋為什么會發生這種情況。當我運行以下代碼時:
library(magrittr)
matrix(c(1,0,0,1), nrow = 2)*5 %>% as.data.frame()
我期待得到
V1 V2
1 5 0
2 0 5
但相反我得到
.
1 5
這很令人困惑,因為當我將as.data.frame呼叫包裹在矩陣構造中時它可以正常作業:
> as.data.frame(matrix(c(1,0,0,1), nrow = 2)*5)
V1 V2
1 5 0
2 0 5
當我也管道乘法函式時:
> matrix(c(1,0,0,1), nrow = 2) %>% `*`(5) %>% as.data.frame()
V1 V2
1 5 0
2 0 5
當我保存中間結果并將其傳遞到下一個函式時:
> v <- matrix(c(1,0,0,1), nrow = 2)*5
> v %>% as.data.frame()
V1 V2
1 5 0
2 0 5
這讓我很確定這是由于在將其發送到管道之前執行了算術運算,我們可以用其他算術和其他函式確認它,以確保它不是特定于*運算子或as.data.frame函式:
# Plus instead of times
> matrix(c(1,0,0,1), nrow = 2) 1 %>% as.data.frame()
.
1 2
# rowSums instead of as.data.frame()
> matrix(c(1,0,0,1), nrow = 2)*5 %>% rowSums()
Error in rowSums(.) : 'x' must be an array of at least two dimensions
我顯然不了解管道如何與算術運算子一起作業或算術函式回傳什么(?),所以我可以對這里發生的事情提出一些建議。這是我無法找到檔案的已知怪癖嗎?Hadley 的書在關于管道的章節中沒有提到這是一個問題,并且技術注釋部分help("%>%")似乎只警告不要捕獲其呼叫環境的函式。as.data.frame最后一點提到了算術運算子,但當結果與切換呼叫和乘法步驟不同時,似乎只有運算子優先級受到影響:
matrix(c(1,0,0,1), nrow = 2) %>% as.data.frame() %>% `*`(5)
V1 V2
1 5 0
2 0 5
為什么將算術修改的矩陣傳遞到另一個函式時會得到不同的結果?
uj5u.com熱心網友回復:
正如?Syntax幫助頁面所指定的,%>%運算子的優先級高于*運算子。這意味著
matrix(c(1,0,0,1), nrow = 2) * 5 %>% as.data.frame()
是相同的
matrix(c(1,0,0,1), nrow = 2) * (5 %>% as.data.frame())
所以 5as.data.frame在乘法matrix發生之前被傳遞給。當組合不同優先級的運算子時,您可以更明確地使用()或{}確保按您期望的順序發生。這兩個都行
(matrix(c(1,0,0,1), nrow = 2) * 5) %>% as.data.frame()
{matrix(c(1,0,0,1), nrow = 2) * 5} %>% as.data.frame()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480384.html
上一篇:從開始日期創建年/季度向量
