[英]How to dynamically create variables names and dynamically assign them a functions to avoid repeating code in R?
我想使我的代碼更干凈,更可維護。 例如,采用以下quantsList
列表:
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組合是無用的。 我猜應該更有效地使用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))
R不能這樣工作。 這不是宏語言。 您真的不想在全局環境中創建一堆散亂的變量。 而是創建一個命名向量(或列表)。 分位數功能旨在返回分位數的向量。
t_probs <- c( 05,10,25,50,75,80,90,95)/100
temp_quants <- quantile( temperature, probs=t_probs)
# If you need them to be named then:
names(temp_quants) <- paste0( "Q_", t_probs)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.