如何动态创建变量名称并动态地为它们分配一个函数以避免在R中重复代码?

问题描述:

我想让我的代码更清洁,更易于维护。例如,采取以下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 Roland

+2

'assign'是非常先进的东西。除非您是R环境中的专家,否则您绝对不应该使用它。在使用R的最近5年多的时间里,我在我自己的工作中没有合法使用'assign'。 – Roland

+1

我也怀疑为什么你正在创建作为文本的R命令。我希望你不打算评估/解析它们。 – Roland

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)