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

时间:2019-04-23 19:59:58

标签: r

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

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

这里hhracehhcnty不存在,但是我想创建一个没有那些元素的列表。

> group_vars <- list(hhrace,hhethn,hhsize,hhinc,hhage,hhcnty,hhkids,hhgeo)
  Error: object 'hhrace' not found

所需的输出-

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

没有hhracehhcnty

3 个答案:

答案 0 :(得分:4)

您可以使用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

对于更一般的情况,您可以创建一个函数:

safe_list <- function(...){
  rlang::enexprs(...) %>% 
    keep(~exists(as.character(.x))) %>%
    set_names(as.character(.)) %>% 
    map(eval)
}

group_vars <- safe_list(hhrace, hhethn, hhsize, hhinc, hhage, hhcnty, hhkids, hhgeo)

答案 1 :(得分:2)

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

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

hhethn <- hhsize <- hhinc <- hhage <- hhkids <- hhgeo <- TRUE

我还使用现有对象的名称创建矢量:

objects <- c("hhrace","hhethn","hhsize","hhinc","hhage","hhcnty","hhkids","hhgeo")

现在,我可能错了,但是我有一种预感,您所需要的只是实际存在的对象的向量。以下将对此有所帮助:

objects[objects %in% ls()]
[1] "hhethn" "hhsize" "hhinc"  "hhage"  "hhkids" "hhgeo" 

但是,如果您确实要列出,则将所有缺失的元素设置为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

为您提供上述结果,但对象不存在的情况除外。

答案 2 :(得分:0)

您可以执行以下操作-

输入-

> 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 

注意-要在lists中使用env,可以使用以下代码-

要获取list中可用的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