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

问题描述 投票:0回答:1

我想让我的代码更清晰,更易于维护。例如,采取以下quantsListlist:

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))
r lapply assign
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.