2013-06-05 5 views

답변

19

은 공교롭게도, 난 그냥이 기능을 썼다. @ joran의 솔루션과 비슷하지만 이미 명명 된 인수를 밟지 않으려 고합니다. 댓글에서 복사

namedList <- function(...) { 
    L <- list(...) 
    snm <- sapply(substitute(list(...)),deparse)[-1] 
    if (is.null(nm <- names(L))) nm <- snm 
    if (any(nonames <- nm=="")) nm[nonames] <- snm[nonames] 
    setNames(L,nm) 
} 
## TESTING: 
a <- b <- c <- 1 
namedList(a,b,c) 
namedList(a,b,d=c) 
namedList(e=a,f=b,d=c) 

: 당신이 CRAN 패키지에서 무언가를 원하는 경우, 당신은 Hmisc::llist를 사용할 수 있습니다

Hmisc::llist(a, b, c, d=a, labels = FALSE) 

유일한 명백한 차이는 각각의 벡터가이 경우에 이름을 가지고있다.

+4

Hmisc :: llist eg llist (a1, a2, labels = FALSE)도 있습니다. 이것은 이미 명명 된 인수 인 – mnel

+0

으로부터 보호합니다. 정말 고마워요! package] (https://github.com/EconometricsBySimulation/RConcerto/blob/master/Package.R) 나는 – fsmart

+1

에서 일하고있다.이 경우'deparse()'때문에 입력 인자가 ~ 60 문자보다 길면 실패 할 것이다. 길이가 1보다 큰 벡터를 생성하고, 'sapply()'는 문자 벡터 대신 목록을 만듭니다. – hadley

11

임의의 생각 :

a1<-1 
a2<-20 
a3<-1:20 

my_list <- function(...){ 
    names <- as.list(substitute(list(...)))[-1L] 
    result <- list(...) 
    names(result) <- names 
    result 
} 

> my_list(a1,a2,a3) 
$a1 
[1] 1 

$a2 
[1] 20 

$a3 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

(. 아이디어는 data.frame의 코드에서 도난)

+3

+1 - 이것은 또한 작동하는 것처럼 보입니다 :'my_list <- function (...) setNames (list (...), substitute (alist (...)))' – flodel

+0

'Hmisc :: llist' 예 :'llist (a1, a2, labels = FALSE)' – mnel

4

또 다른 아이디어,

sapply(ls(pattern='^a[0-9]'), get) 
$a1 
[1] 1 

$a2 
[1] 20 

$a3 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
+3

또는 간단히'mget (c ('a1', 'a2', 'a3'))'('mget'가 아닌'sapply (... , get)' – mnel

관련 문제