0
我想讓我的代碼更清潔,更易於維護。例如,採取以下quantsList
列表:如何動態創建變量名稱並動態地爲它們分配一個函數以避免在R中重複代碼?
var <- "temperature"
quantsList <- list(
q05 <- paste0('quantile(',var,', probs=.05, na.rm = TRUE)')
q10 <- paste0('quantile(',var,', probs=.10, na.rm = TRUE)')
q25 <- paste0('quantile(',var,', probs=.25, na.rm = TRUE)')
q50 <- paste0('quantile(',var,', probs=.50, na.rm = TRUE)')
q75 <- paste0('quantile(',var,', probs=.75, na.rm = TRUE)')
q80 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)')
q90 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)')
q95 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)')
)
這是創建這個5個元素列表中的大量重複的,我想了解如何避免此類不良編碼的,尤其是對列出了可能> 100元素。我的搜索引導我到assign()
並且是對應的get()
函數。但我無法弄清楚如何正確「玩」這些。現在,我有什麼:
# Attempt to create the list "quants" with dynamically named elements storing dynamically created functions
assignFuns <- function(q){
quant = paste0("q",q)
assign(quant, paste0('quantile(',var,', probs=.',q,', na.rm = TRUE)'))
return(get(quant))
}
quants <- list(05,10,25,50,75,80,90,95)
quantsList <- lapply(quants, assignFuns)
這樣做quantList
包含存儲位數功能的元件,但列表中的元素是未命名的。
我知道我可以用簡單的命名列表中的元素:
names(quantsFuns) <- lapply(quants, function(x) paste0("q",x))
但這個工作流程似乎我來說太令人費解,並在那一刻我分配的組合,並得到也沒用。我想應該有更高效的使用assign()
或get()
。我是否應該修改我的assignFuns()
函數,使其返回名稱和相應的函數,還是應該以完全不同的方式進行操作?
感謝您的見解,你能提供給我關於這個問題
編輯
所以根據@Roland,assign()
是避免幫助。所以我簡單地使用這個代碼:
assignFuns <- function(q){
quantFun <- paste0('quantile(',var,', probs=.',q,', na.rm = TRUE)')
return(quantFun)
}
quants <- list(05,10,25,50,75,80,90,95)
quantsFuns <- lapply(quants, assignFuns)
names(quantsFuns) <- lapply(quants, function(x) paste0("q",x))
請勿將其分配給單獨的符號。簡單地做這樣的事情:'prob < - c(0.05,0.1,0.25,0.5,0.75,0.8,0.8,0.8);格式C(prob,digits = 2,format =「f」),fixed = TRUE); paste0('quantile(',var,',probs =',prob,',na.rm = TRUE'')' – Roland
'assign'是非常先進的東西。除非您是R環境中的專家,否則您絕對不應該使用它。在使用R的最近5年多的時間裏,我在我自己的工作中沒有合法使用'assign'。 – Roland
我也懷疑爲什麼你正在創建作爲文本的R命令。我希望你不打算評估/解析它們。 – Roland