我想在資料框中使用多對變數制作許多圖,所有變數都具有相同的 x。我將圖存盤在命名串列中。為簡單起見,下面是一個示例,每個圖中只有 1 個變數。
這個函式的關鍵是一個select()呼叫,這里顯然不是必需的,而是我的實際資料。
函式的主體在每個變數上都可以正常作業,但是當我遍歷變數串列時,串列中的最后一個總是產生
get(ll) 中的錯誤:找不到物件“d”。
(或任何最后一個變數,如果不是'd')。替換data <- df %>% select(x,ll)為data <- df避免錯誤。
## make data
df2 <- data.frame(x = 1:10,
a = 1:10,
b = 2:11,
c = 101:110,
d = 10*(1:10))
## make function
testfun <- function(df = df2, vars = letters[1:4]){
## initialize list to store plots
plotlist <- list()
for (ll in vars){
## subset data
data <- df %>% select(x, ll) ## comment out select() to get working function
# print(data) ## uncomment to check that dataframe subset works correctly
## plot variable vs. x
p <- ggplot(data,
aes(x = x, y = get(ll)))
geom_point()
ylab(ll)
## add plot to named list
plotlist[[ll]] <- p
# print(p) ## uncomment to see that each plot is being made
}
return(plotlist) ## unnecessary, being explicit for troubleshooting
}
## use function
pl <- testfun(df2)
## error ?
pl
我有一個解決方法,可以select()通過在我的實際資料框中重命名變數來避免,但我很好奇為什么這不起作用?有任何想法嗎?
uj5u.com熱心網友回復:
get()可以作業,但不能ll直接使用。嘗試y = get(!!ll)或y = {{ll}}。
ggplot(或者也許aes,很難說)等待運行此代碼,直到它的繪圖物件被參考,正如所提供代碼中的錯誤所示。到每個 ggplot 評估get(ll)時,for 回圈已經完成。因此,計算所有四個 ggplotll的回圈變數 的最后一個值。在錯誤中出現“d”使得它看起來像是最后一個失敗的 ggplot 物件,但它實際上是在評估導致此錯誤的第一個物件。"d"ll
在回圈體中,我們想要一種方法來評估ll變數并將結果字串(“a”、“b”、“c”或“d”)粘貼到這段代碼中,其余的不會運行到稍后。更改y = get(ll)為y = get(!!ll)是執行此操作的一種方法:對未評估的運算式(在 Tidyverse 檔案中稱為“代碼藍圖”)!!執行“
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416791.html
標籤:
