我想基于某些元素创建一个列表,即使这些元素不可用。
> group_vars <- list(hhrace,hhethn,hhsize,hhinc,hhage,hhcnty,hhkids,hhgeo)
这里hhrace
和hhcnty
不存在,但是我想创建一个没有那些元素的列表。
> group_vars <- list(hhrace,hhethn,hhsize,hhinc,hhage,hhcnty,hhkids,hhgeo)
Error: object 'hhrace' not found
所需的输出-
> group_vars
hhethn,hhsize,hhinc,hhage,hhkids,hhgeo
没有hhrace
和hhcnty
。
答案 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