2017-12-18 96 views
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)) 
+1

請勿將其分配給單獨的符號。簡單地做這樣的事情:'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

+2

'assign'是非常先進的東西。除非您是R環境中的專家,否則您絕對不應該使用它。在使用R的最近5年多的時間裏,我在我自己的工作中沒有合法使用'assign'。 – Roland

+1

我也懷疑爲什麼你正在創建作爲文本的R命令。我希望你不打算評估/解析它們。 – Roland

回答

1

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) 
相關問題