Создание списка в R, когда некоторые элементы списка недоступны - PullRequest
3 голосов
/ 23 апреля 2019

Я хочу создать список на основе некоторых элементов, даже если элементы недоступны.

> 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.

Ответы [ 3 ]

4 голосов
/ 23 апреля 2019

Вы можете сохранить их в списке выражений с помощью 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)
2 голосов
/ 23 апреля 2019

Я просто хочу подобрать решение, предложенное в комментариях, которое я считаю более полезным, чем оценили.

Чтобы установить сцену, давайте создадим объекты, как это сделал 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

, который дает вышеуказанные результаты, за исключением случаев, когда объект не существует.

0 голосов
/ 24 апреля 2019

Вы можете сделать что-то вроде этого -

ВХОД

> 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)

output-

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...