当某些列表元素不可用时,在R中创建列表

当某些列表元素不可用时,在R中创建列表,r,R,我想基于一些元素创建一个列表,即使这些元素不可用 > group_vars <- list(hhrace,hhethn,hhsize,hhinc,hhage,hhcnty,hhkids,hhgeo) 所需输出- > group_vars hhethn,hhsize,hhinc,hhage,hhkids,hhgeo 如果没有hhrace和hhcnty,您可以使用rlang::exprs将它们存储在表达式列表中,并且只保留存在的表达式: library(purrr) #

我想基于一些元素创建一个列表,即使这些元素不可用

> group_vars <- list(hhrace,hhethn,hhsize,hhinc,hhage,hhcnty,hhkids,hhgeo)
所需输出-

> group_vars
  hhethn,hhsize,hhinc,hhage,hhkids,hhgeo

如果没有
hhrace
hhcnty
,您可以使用
rlang::exprs
将它们存储在表达式列表中,并且只保留存在的表达式:

library(purrr)

# define variables in global environment
hhethn <- hhsize <- hhinc <- hhage <- hhkids <- hhgeo <- TRUE

group_vars <- rlang::exprs(hhrace, hhethn, hhsize, hhinc, hhage, hhcnty, hhkids, hhgeo) %>% 
  keep(~exists(as.character(.x))) %>% 
  set_names(as.character(.)) %>% 
  map(eval)

group_vars
#$hhethn
#[1] TRUE
#
#$hhsize
#[1] TRUE
#
#$hhinc
#[1] TRUE
#
#$hhage
#[1] TRUE
#
#$hhkids
#[1] TRUE
#
#$hhgeo
#[1] TRUE
库(purrr)
#在全局环境中定义变量

hhehno我只想选择评论中建议的解决方案,我认为这比欣赏更有用

要设置舞台,让我们像DiceboyT那样创建对象:

hhethn <- hhsize <- hhinc <- hhage <- hhkids <- hhgeo <- TRUE
但是,如果您确实想列出,以下内容也会有所帮助,将所有缺少的元素设置为FALSE:

mget(objects, ifnotfound = FALSE)
$hhrace
[1] FALSE
$hhethn
[1] TRUE
$hhsize
[1] TRUE
$hhinc
[1] TRUE
$hhage
[1] TRUE
$hhcnty
[1] FALSE
$hhkids
[1] TRUE
$hhgeo
[1] TRUE
现在,要获得这些项目的列表(除了缺少的项目),我们还可以执行以下操作:

tmpfun <- function(lst, nme) {
  tryCatch(
    lst[[nme]] <- get(nme)
    , error = function(e) {return(lst)}
  )
  return(lst)
}

Reduce(tmpfun, objects, init = list())
$hhethn
[1] TRUE
$hhsize
[1] TRUE
$hhinc
[1] TRUE
$hhage
[1] TRUE
$hhkids
[1] TRUE
$hhgeo
[1] TRUE

tmpfun您可以这样做-

输入-

> objects <- c("hhrace","hhethn","hhsize","hhinc","hhage","hhcnty","hhkids","hhgeo")
> hhsize=list(a=2)
> hhinc=list(a=5)
> hhethn=list(a=50)

> sapply(objects,function(x) if(exists(x)) TRUE else  FALSE)
注意-要在
环境中获得可用的
列表
,您可以使用以下代码-

要仅获取
列表
中可用的
env
名称,您可以使用-

> names(which(sapply(objects,function(x) if(exists(x)) TRUE else  FALSE)))
[1] "hhethn" "hhsize" "hhinc" 
要获得完整的列表元素,可以使用以下代码

> mget(names(which(sapply(objects,function(x) if(exists(x)) TRUE else  FALSE))))

$hhethn
$hhethn$a
[1] 50


$hhsize
$hhsize$a
[1] 2


$hhinc
$hhinc$a
[1] 5

也许
group\u vars感谢您的输入,它会选择所有具有HH的对象。寻找更具体的结果。如果下面的任何问题都回答了你的问题,请考虑点击“<代码> V>代码>,然后在旁边签名。我去了一个类似的地方。我认为您可以使用内置函数改进
tmpfun
Filter(函数(x)!is.null(x),mget(对象,ifnotfound=list(null))
。唯一剩下的就是用它自己的函数来包装它。
tmpfun <- function(lst, nme) {
  tryCatch(
    lst[[nme]] <- get(nme)
    , error = function(e) {return(lst)}
  )
  return(lst)
}

Reduce(tmpfun, objects, init = list())
$hhethn
[1] TRUE
$hhsize
[1] TRUE
$hhinc
[1] TRUE
$hhage
[1] TRUE
$hhkids
[1] TRUE
$hhgeo
[1] TRUE
> objects <- c("hhrace","hhethn","hhsize","hhinc","hhage","hhcnty","hhkids","hhgeo")
> hhsize=list(a=2)
> hhinc=list(a=5)
> hhethn=list(a=50)

> sapply(objects,function(x) if(exists(x)) TRUE else  FALSE)
hhrace hhethn hhsize  hhinc  hhage hhcnty hhkids  hhgeo 
 FALSE   TRUE   TRUE   TRUE  FALSE  FALSE  FALSE  FALSE 
> names(which(sapply(objects,function(x) if(exists(x)) TRUE else  FALSE)))
[1] "hhethn" "hhsize" "hhinc" 
> mget(names(which(sapply(objects,function(x) if(exists(x)) TRUE else  FALSE))))

$hhethn
$hhethn$a
[1] 50


$hhsize
$hhsize$a
[1] 2


$hhinc
$hhinc$a
[1] 5