簡體   English   中英

如何動態創建變量名並為它們動態分配一個函數,以避免在R中重復代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM