R에서 목록을 올바르게 사용하는 방법?


320

간단한 배경 : 널리 사용되는 많은 (대부분의) 현대 프로그래밍 언어에는 적어도 몇 개의 ADT (추상 데이터 유형)가 공통적으로 있습니다.

  • 문자열 (문자로 구성된 시퀀스)

  • 목록 (정렬 된 값 모음) 및

  • 지도 기반 유형 (키를 값에 매핑하는 정렬되지 않은 배열)

R 프로그래밍 언어에서 처음 두 개는 각각 character및 로 구현됩니다 vector.

R을 배우기 시작했을 때, 거의 처음부터 두 가지가 명백 list했습니다 .R에서 가장 중요한 데이터 유형입니다 (R의 부모 클래스이기 때문에 data.frame). 그리고 두 번째로, 그들이 어떻게 작동했는지 이해할 수 없었습니다. 내 코드에서 올바르게 사용하기에 충분하지 않습니다.

우선 R의 list데이터 유형은 맵 ADT ( dictionaryPython, NSMutableDictionaryObjective C, hashPerl 및 Ruby, object literalJavascript 등)를 간단하게 구현 한 것 같습니다 .

예를 들어, 키-값 쌍을 생성자 (Python의 경우는 dict아님 list) 에 전달하여 Python 사전과 같이 생성합니다 .

x = list("ev1"=10, "ev2"=15, "rv"="Group 1")

그리고 파이썬 사전과 같이 R List의 항목에 액세스합니다 (예 :) x['ev1']. 마찬가지로 다음과 같이 '키' 또는 '값' 만 검색 할 수 있습니다 .

names(x)    # fetch just the 'keys' of an R list
# [1] "ev1" "ev2" "rv"

unlist(x)   # fetch just the 'values' of an R list
#   ev1       ev2        rv 
#  "10"      "15" "Group 1" 

x = list("a"=6, "b"=9, "c"=3)  

sum(unlist(x))
# [1] 18

그러나 R list은 다른지도 유형의 ADT 와 다릅니다 (어쨌든 내가 배운 언어 중에서). 내 생각에 이것은 S의 초기 사양, 즉 기초부터 데이터 / 통계 DSL (도메인 특정 언어)을 설계하려는 의도의 결과라고 생각합니다.

list널리 사용되는 다른 언어 (예 : Python, Perl, JavaScript)에서 R 과 매핑 유형의 세 가지 중요한 차이점 :

먼저 , listR에서 S는이다 정렬 막 벡터처럼 그 값을 키가되는 경우에도 (즉, 키는 임의의 해쉬 값이 아닌 정수 순차적 일 수있다), 수집. 거의 항상 다른 언어의 매핑 데이터 형식이 정렬되지 않았습니다 .

둘째 , listS는 당신이 전달되지 않습니다에도 불구하고 기능에서 반환 할 수 있습니다 list당신이 함수를 호출 할 때, 그리고 비록 (가) 반환 된 기능 list(명시 적)이 포함되어 있지 않습니다 list물론 (생성자, 당신에 의해 실제로이 처리 할 수 을 호출하여 반환 된 결과를 래핑 unlist:

x = strsplit(LETTERS[1:10], "")     # passing in an object of type 'character'

class(x)                            # returns 'list', not a vector of length 2
# [1] list

세 번째 R의의 독특한 기능 list들 : 그들이 다른 ADT의 구성원이 될 수 있다는 것을하지 않는 것, 당신이 그렇게하려고하면 다음 기본 컨테이너는 강제 변환됩니다 list. 예 :

x = c(0.5, 0.8, 0.23, list(0.5, 0.2, 0.9), recursive=TRUE)

class(x)
# [1] list

여기에서의 나의 의도는 언어를 비판하거나 언어를 문서화하는 방법이 아니다. 마찬가지로 list데이터 구조 또는 작동 방식에 문제가 있음을 제안하지 않습니다 . 내가 추구하는 것은 그것들이 어떻게 작동하는지에 대한 나의 이해로 코드에서 올바르게 사용할 수 있습니다.

내가 더 잘 이해하고 싶은 종류는 다음과 같습니다.

  • 함수 호출이 언제 list(예 : strsplit위에서 언급 한 표현)을 반환 할 것인지를 결정하는 규칙은 무엇입니까 ?

  • 명시 적으로 이름을 list(예 :)에 할당하지 않으면 list(10,20,30,40)기본 이름은 1로 시작하는 순차 정수입니까? (그렇지 않으면 우리는 이러한 유형의 강요 할 수없는 것, 내가 생각,하지만 난 대답은 '예'확신에서 멀리이다 listw /로 전화 벡터에 unlist.)

  • 이 두 개의 다른 연산자 인 [], 및 왜 같은 결과를 [[]]반환 합니까?

    x = list(1, 2, 3, 4)

    두 표현식 모두 "1"을 반환합니다.

    x[1]

    x[[1]]

  • 왜이 두 표현식 이 같은 결과를 반환 하지 않습니까?

    x = list(1, 2, 3, 4)

    x2 = list(1:4)

R 문서 ( ?list, R-intro) 를 가리 키지 마십시오. 필자는이 내용을주의 깊게 읽었으며 위에서 언급 한 유형의 질문에 대답하는 데 도움이되지 않습니다.

(마지막으로, 최근 에 S4 클래스를 통해 일반적인 맵 유형 동작 hash을 구현 하는 R 패키지 (CRAN에서 사용 가능)를 배우고 사용하기 시작했습니다 .이 패키지를 확실히 추천 할 수 있습니다.)


3
을 사용 x = list(1, 2, 3, 4)하면 두 가지 모두 같은 결과를 반환하지 않습니다 : x[1], 및 x[[1]]. 첫 번째는 목록을 반환하고 두 번째는 숫자 벡터를 반환합니다. 아래로 스크롤하면 Dirk 이이 질문을 올바르게 처리 한 유일한 응답자 인 것 같습니다.
IRTFM

2
listR의 해시와는 다른 방법으로 귀하의 목록을 확장하는 사람 은 없었습니다. 주목할만한 것이 하나 더 있습니다. listR에서 동일한 참조 이름을 가진 두 개의 멤버를 가질 수 있습니다. 이것이 obj <- c(list(a=1),list(a=2))유효하고 이름이 'a'인 두 개의 값이있는 목록을 리턴한다고 가정하십시오. 이 경우에 대한 호출 obj["a"]은 첫 번째 일치하는 목록 요소 만 리턴합니다. R의 환경을 사용하여 참조 된 이름 당 하나의 항목 만있는 해시와 유사한 동작을 얻을 수 있습니다 (예x <- new.env(); x[["a"]] <- 1; x[["a"]] <- 2; x[["a"]]
russellpierce

1
지난 6 개월 동안 세 번의 답변으로이 게시물을 다시 읽었으며 매번 더 많은 깨달음을 발견했습니다. 좋은 질문과 몇 가지 좋은 답변. 감사합니다.
Rich Lysakowski 박사

답변:


150

a listvectorR 의 차이점을 실제로 지적하기 때문에 질문의 마지막 부분을 해결하십시오 .

이 두 표현식이 같은 결과를 반환하지 않는 이유는 무엇입니까?

x =리스트 (1, 2, 3, 4); x2 = 목록 (1 : 4)

목록은 각 요소로서 다른 클래스를 포함 할 수 있습니다. 따라서 첫 번째 요소는 문자형 벡터이고 두 번째 요소는 데이터 프레임 등의 목록을 가질 수 있습니다.이 경우 두 개의 다른 목록을 만들었습니다. x길이 x2가 각각 4 개인 벡터가 있고 길이가 4 인 벡터 가 1 개인 경우

> length(x[[1]])
[1] 1
> length(x2[[1]])
[1] 4

이것들은 완전히 다른 목록입니다.

R리스트는 해시 맵 과 매우 비슷 합니다 각 인덱스 값이 어떤 객체와도 연관 될 수 있다는 점에서 데이터 구조 합니다. 다음은 3 가지 다른 클래스 (함수 포함)를 포함하는 간단한 예입니다.

> complicated.list <- list("a"=1:4, "b"=1:3, "c"=matrix(1:4, nrow=2), "d"=search)
> lapply(complicated.list, class)
$a
[1] "integer"
$b
[1] "integer"
$c
[1] "matrix"
$d
[1] "function"

마지막 요소가 검색 함수라고 가정하면 다음과 같이 호출 할 수 있습니다.

> complicated.list[["d"]]()
[1] ".GlobalEnv" ...

이것에 대한 최종 의견으로 : data.frame 는 실제로 ( data.frame문서에서) 목록입니다 .

데이터 프레임은 ''data.frame ''클래스에서 고유 한 행 이름을 가진 동일한 수의 행에 대한 변수 목록입니다.

그렇기 때문에의 열 data.frame은 다른 데이터 유형을 가질 수 있지만 행렬의 열은 그렇지 않습니다. 예를 들어, 숫자와 문자가 포함 된 행렬을 만들려고합니다.

> a <- 1:4
> class(a)
[1] "integer"
> b <- c("a","b","c","d")
> d <- cbind(a, b)
> d
 a   b  
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
> class(d[,1])
[1] "character"

두 번째 열에 문자가 있기 때문에 첫 번째 열의 데이터 유형을 숫자로 변경하는 방법에 유의하십시오.

> d[,1] <- as.numeric(d[,1])
> class(d[,1])
[1] "character"

4
감사합니다. (이미 알고 있듯이 예를 들어 '복잡한 목록'을 다시 작성하는 것은 C ++, Java 등에서 'switch'문을없는 언어로 복제하는 표준 방법입니다. 아마도 좋은 방법입니다. 필요한 경우 R 에서이 작업을 수행하십시오). +1
doug

8
switchR에는 그 목적으로 사용할 수 있는 유용한 기능 이 있지만 (참고 자료 참조 help(switch))
Shane

63

질문에 대해서는 순서대로 처리하고 몇 가지 예를 들어 보겠습니다.

1 ) return 문이 추가되면 목록이 반환됩니다. 치다

 R> retList <- function() return(list(1,2,3,4)); class(retList())
 [1] "list"
 R> notList <- function() return(c(1,2,3,4)); class(notList())
 [1] "numeric"
 R> 

2 ) 이름은 단순히 설정되지 않습니다 :

R> retList <- function() return(list(1,2,3,4)); names(retList())
NULL
R> 

3 ) 그들은 같은 일을 반환하지 않습니다. 당신의 예는

R> x <- list(1,2,3,4)
R> x[1]
[[1]]
[1] 1
R> x[[1]]
[1] 1

여기서 - x[1]의 첫 번째 요소를 반환합니다 . 모든 스칼라는 길이가 1 인 벡터입니다. 반면에 목록의 첫 번째 요소를 반환합니다.xxx[[1]]

4 ) 마지막으로 두 요소는 각각 4 개의 스칼라가 포함 된 목록과 단일 요소가있는 목록 (4 개의 요소로 구성된 벡터)에서 서로 다릅니다.


1
매우 도움이되었습니다. 감사합니다. (답변의 항목 # 1을 다시 읽으십시오-동의하지만, 내가 생각한 것은 사용자가 만든 함수가 아닌 'strsplit'과 같은 내장 기능이었습니다.) 어쨌든, 나에게서 +1.
doug

2
@doug item # 1 정보 유일한 방법은 섹션의 특정 기능에 대한 도움말을 확인하는 것입니다 Value. ?strsplit"x와 같은 길이의 목록" 과 같습니다. 그러나 인수에 따라 다른 값을 반환하는 함수가있을 수 있음을 고려해야합니다 (예 : sapply는 목록 또는 벡터를 반환 할 수 있음).
Marek

34

질문의 일부를 가져 오려면 :

이 기사 색인에이 차이의 문제 해결 [][[]] .

간단히 [[]]는 목록에서 단일 항목을 []선택하고 선택한 항목의 목록을 반환합니다. 예제에서 x = list(1, 2, 3, 4)'항목 1은 단일 정수이지만 x[[1]]단일 1을 x[1]반환하고 값이 하나만있는 목록을 반환합니다.

> x = list(1, 2, 3, 4)
> x[1]
[[1]]
[1] 1

> x[[1]]
[1] 1

그건 그렇고, 플랫 배열 A = array( 11:16, c(2,3) ); A[5]에서 15 입니까?!
데니스

13

목록이 작동하는 순서대로 작동하는 한 가지 이유는 모든 노드에서 유형을 포함 할 수있는 벡터가 아닌 정렬 된 컨테이너의 필요성을 해결하기위한 것입니다. 목록은 R의 기본 구성을 포함하여 R의 다양한 목적으로 재사용됩니다.data.frame 임의의 유형 (그러나 동일한 길이)의 벡터리스트 인 .

이 두 표현식이 같은 결과를 반환하지 않는 이유는 무엇입니까?

x = list(1, 2, 3, 4); x2 = list(1:4)

@Shane의 답변에 추가하려면 동일한 결과를 얻으려면 다음을 시도하십시오.

x3 = as.list(1:4)

벡터 1:4를 목록으로 강제합니다 .


11

이것에 하나 이상의 포인트를 추가하십시오.

R은에서 파이썬 딕셔너리에 해당하는 데이터 구조 가지고 패키지를 . 이 블로그 게시물에서 Open Data Group의 내용을 읽을 수 있습니다 . 다음은 간단한 예입니다.hash

> library(hash)
> h <- hash( keys=c('foo','bar','baz'), values=1:3 )
> h[c('foo','bar')]
<hash> containing 2 key-value pairs.
  bar : 2
  foo : 1

유용성 측면에서 hash클래스는 목록과 매우 유사합니다. 그러나 대규모 데이터 세트의 경우 성능이 더 좋습니다.


1
해시 패키지를 알고 있습니다. 원래의 질문에서 전통적인 해시 유형에 적합한 프록시로 언급되었습니다.
doug

또한 hash :: hash의 사용은 해시 된 환경 ( rpubs.com/rpierce/hashBenchmarks)과 관련하여 의심스러운 유틸리티 입니다.
russellpierce

9

당신은 말합니다 :

다른 경우, 함수를 호출 할 때 List에 전달한 적이없고 함수에 List 생성자가 포함되어 있지 않더라도 함수에서 목록을 반환 할 수 있습니다.

x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x)
# => 'list'

그리고 이것이 문제라고 제안한다고 생각합니다 (?). 나는 그것이 왜 문제가 아닌지 당신에게 이야기하기 위해 왔습니다 :-). 문자열 분리를 할 때 1 요소 길이의 요소가있는 목록 x[[1]]이 있으므로와 동일한 것을 알 수 있습니다 unlist(x)[1]. 그러나 strsplit각 빈에서 길이가 다른 결과가 반환 되면 어떻게 될까요? 단순히 벡터 (목록과 목록)를 반환하는 것은 전혀 효과가 없습니다.

예를 들어 :

stuff <- c("You, me, and dupree",  "You me, and dupree",
           "He ran away, but not very far, and not very fast")
x <- strsplit(stuff, ",")
xx <- unlist(strsplit(stuff, ","))

첫 번째 경우 ( x:는 목록을 반환) 세 번째 문자열의 두 번째 "부분"이 무엇인지 알 수 있습니다. 예를 들면 다음과 같습니다.x[[3]][2] . xx결과가 "비공개"( unlist-ed) 되었으므로 어떻게 똑같이 할 수 있습니까?


5
x = list(1, 2, 3, 4)
x2 = list(1:4)
all.equal(x,x2)

1 : 4는 c (1,2,3,4)와 동일하므로 동일하지 않습니다. 당신이 그들을 동일하게하고 싶다면 :

x = list(c(1,2,3,4))
x2 = list(1:4)
all.equal(x,x2)

4

이것은 매우 오래된 질문이지만, 내 의견으로는 아무도 OP의 일부 우려를 직접 다루지 않았기 때문에 새로운 답변이 가치를 더할 수 있다고 생각합니다.

허용 된 답변이 제안하는 내용에도 불구하고 listR의 객체는 해시 맵 이 아닙니다 . 파이썬과 평행을 이루고 싶다면 list파이썬 list(또는 tuple실제로는) 과 비슷합니다 .

대부분의 R 오브젝트가 내부적으로 저장되는 방식을 설명하는 것이 좋습니다 (R 오브젝트의 C 유형은 SEXP). 기본적으로 세 부분으로 구성됩니다.

  • 객체의 R 유형, 길이 및 기타 메타 데이터를 선언하는 헤더;
  • 표준 C 힙 할당 어레이 (인접한 메모리 블록) 인 데이터 부분;
  • 다른 R 객체에 대한 포인터의 명명 된 링크 된 목록 인 속성 (또는 NULL객체에 속성이없는 경우)

내부 관점에서, 예를 들어 a listnumeric벡터 사이에는 거의 차이가 없습니다 . 그들이 저장하는 값은 다릅니다. 두 객체를 앞에서 설명한 패러다임으로 나누겠습니다.

x <- runif(10)
y <- list(runif(10), runif(3))

의 경우 x:

  • 헤더는 유형이 numeric(REALSXP C면), 길이는 10 및 기타 물건 .
  • 데이터 부분은 10 개의 double값을 포함하는 배열 입니다.
  • NULL객체에는 속성이 없으므로 속성은 입니다.

의 경우 y:

  • 헤더는 유형이 list( VECSXPC면), 길이는 2 및 기타 물건 이라고 말합니다 .
  • 데이터 부분은 2 개의 SEXP 유형에 대한 2 개의 포인터를 포함 runif(10)하고 runif(3)각각에 의해 얻어진 값을 가리키는 어레이가 될 것이다 .
  • 속성은 NULL입니다 x.

따라서 numeric벡터와 a 의 유일한 차이점 listnumeric데이터 부분은 double값으로 구성되고 list데이터 부분은 다른 R 객체에 대한 포인터 배열이라는 것입니다.

이름은 어떻게 되나요? 이름은 객체에 할당 할 수있는 속성 중 일부일뿐입니다. 아래의 객체를 보자.

z <- list(a=1:3, b=LETTERS)
  • 헤더는 유형이 list( VECSXPC면), 길이는 2 및 기타 물건 이라고 말합니다 .
  • 데이터 부분은 2 개의 SEXP 유형에 대한 2 개의 포인터를 포함 1:3하고 LETTERS각각에 의해 얻어진 값을 가리키는 어레이가 될 것이다 .
  • 속성이 현재 존재하며 value names가있는 characterR 객체 인 구성 요소입니다 c("a","b").

R 레벨에서 attributes함수 를 사용하여 오브젝트의 속성을 검색 할 수 있습니다 .

R에서 해시 맵의 전형적인 키-값은 단지 환상 일뿐입니다. 당신이 말할 때:

z[["a"]]

이것이 일어나는 일입니다.

  • [[서브 세트 함수가 호출되고;
  • 함수 ( "a") 의 인수는 유형 character이므로 names객체 의 속성 (있는 경우) 에서 이러한 값을 검색하도록 지시됩니다 z.
  • 경우 names속성이없는, NULL반환;
  • 존재하는 경우 "a"값이 검색됩니다. 경우 "a"객체의 이름이 아닌, NULL반환;
  • 존재하는 경우, 위치가 결정된다 (예에서 1). 따라서 목록의 첫 번째 요소가 반환 z[[1]]됩니다.

키-값 검색은 다소 간접적이며 항상 위치 적입니다. 또한 다음 사항에 유의하십시오.

  • 해시 맵에서 키에 필요한 유일한 제한은 해시 가능해야한다는 것 입니다 . namesR에서 문자열 ( character벡터) 이어야합니다 .
  • 해시 맵에서는 두 개의 동일한 키를 가질 수 없습니다. R에서는 names반복되는 값으로 객체에 할당 할 수 있습니다 . 예를 들어 :

    names(y) <- c("same", "same")

    R에서 완벽하게 유효합니다. 시도 y[["same"]]하면 첫 번째 값이 검색됩니다. 이 시점에서 이유를 알아야합니다.

결론적으로, 객체에 임의의 속성을 부여하는 능력은 외부 관점과는 다른 모습을 보여줍니다. 그러나 R list은 어떤 식 으로든 해시 맵이 아닙니다.


2

다른 언어의 벡터 및 해시 / 배열 개념 관련 :

  1. 벡터는 R의 원자입니다. 예를 들어, rpois(1e4,5)(5 개의 난수), numeric(55)(길이 55의 복식 위의 0 벡터) 및 character(12)(12 개의 빈 문자열)은 모두 "기본"입니다.

  2. 목록이나 벡터 중 하나를 가질 수 있습니다 names.

    > n = numeric(10)
    > n
     [1] 0 0 0 0 0 0 0 0 0 0
    > names(n)
    NULL
    > names(n) = LETTERS[1:10]
    > n
    A B C D E F G H I J 
    0 0 0 0 0 0 0 0 0 0
  3. 벡터는 모든 데이터 유형이 동일해야합니다. 이것을보세요:

    > i = integer(5)
    > v = c(n,i)
    > v
    A B C D E F G H I J           
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    > class(v)
    [1] "numeric"
    > i = complex(5)
    > v = c(n,i)
    > class(v)
    [1] "complex"
    > v
       A    B    C    D    E    F    G    H    I    J                          
    0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i
  4. 다른 답변과 OP의 질문 자체에서 볼 수 있듯이 목록에는 다양한 데이터 유형이 포함될 수 있습니다.

"배열"에 가변 데이터 유형이 포함될 수있는 언어 (루비, 자바 스크립트)를 보았지만 C ++에서 "배열"은 모두 동일한 데이터 유형이어야합니다. 나는이 속도 / 효율 일이 생각 : 당신이 경우 numeric(1e6)당신은 크기와 각 요소의 위치를 알고 선험적 ; 물건에 "Flying Purple People Eaters"알 수없는 조각 이 포함될 수 있다면 실제로 물건을 파싱하여 기본적인 사실을 알아야합니다.

특정 표준 R 작업은 유형이 보장 될 때 더 의미가 있습니다. 예를 들어 유형이 두 배로 보장되지 않으면 cumsum(1:9)의미 cumsum(list(1,2,3,4,5,'a',6,7,8,9))가 없습니다.


두 번째 질문에 관해서 :

함수를 호출 할 때 List에 전달 된 적이 없어도 함수에서 목록을 반환 할 수 있습니다.

함수는 항상 입력되는 것과 다른 데이터 형식을 반환합니다. plot플롯을 입력으로 사용하지 않더라도 플롯을 반환합니다. Argnumeric수락하더라도을 반환합니다 complex. 기타.

(그리고 strsplit소스 코드는 여기에 있습니다 .)


2

이것은 꽤 오래된 질문이지만 R의 첫 번째 단계에서 누락 된 지식과 정확히 일치한다고 말해야합니다. 즉, 손에 데이터를 R의 객체로 표현하는 방법 또는 기존 객체에서 선택하는 방법. R 초보자는 처음부터 "R 상자에서"생각하기가 쉽지 않습니다.

그래서 나는 아래에서 목발을 사용하기 시작했습니다. 이로 인해 어떤 데이터에 어떤 객체를 사용 해야하는지, 기본적으로 실제 사용을 상상할 수있었습니다.

질문에 대한 정확한 답변을 제공하지는 않지만 아래의 짧은 텍스트는 R로 시작하여 간단한 질문을하는 독자에게 도움이 될 수 있습니다.

  • 원자 벡터 ... 나는 그 방향을 지시하지 않고 동일한 유형의 시퀀스로 "시퀀스"라고 불렀습니다. [서브 세트.
  • 벡터 ... 2D에서 한 방향으로 시퀀스 [ 서브셋 .
  • 행렬 ... 행 또는 열을 형성하는 동일한 길이의 벡터 묶음, [ 행, 열 및 시퀀스 별 하위 집합 .
  • 3D를 형성하는 배열 ... 계층 행렬
  • Dataframe ... Excel과 같은 2D 테이블로 행이나 열을 정렬, 추가 또는 제거하거나 속성을 만들 수 있습니다. 데이터 프레임이 행과 열을 list사용하여 하위 집합을 사용할 수 [있지만 심지어는을 사용하여 부분 집합을 할 수 있는 영리한 구현이라는 것을 정말로 인식했습니다 [[.
  • 목록 ... 자신을 돕기 위해 나는 현재의 목록에 대해 생각 tree structure어디 [i]를 선택 반환 전체 지점과 [[i]]지점에서 반환 항목을 선택합니다. 그것 때문에 tree like structure, 당신은 그것의 사용하여 index sequence매우 복잡한에 모든 단일 리프를 해결 하기 위해 사용할 수 있습니다 . 목록은 단순하거나 매우 복잡 할 수 있으며 다양한 유형의 객체를 하나로 혼합 할 수 있습니다.list[[index_vector]]

따라서 다음 예제와 같이 상황에 따라 lists선택하는 방법에 대한 더 많은 방법 을 얻을 수 있습니다 leaf.

l <- list("aaa",5,list(1:3),LETTERS[1:4],matrix(1:9,3,3))
l[[c(5,4)]] # selects 4 from matrix using [[index_vector]] in list
l[[5]][4] # selects 4 from matrix using sequential index in matrix
l[[5]][1,2] # selects 4 from matrix using row and column in matrix

이런 생각은 저에게 많은 도움이되었습니다.


1

도움이된다면 R의 "목록"을 다른 사전 OO 언어의 "레코드"로 생각하는 경향이 있습니다.

  • 그것들은 중요한 유형에 대해 어떤 가정도하지 않습니다 (또는 어떤 arity와 field 이름의 가능한 모든 레코드 유형이 사용 가능합니다).
  • 해당 필드는 익명 일 수 있습니다 (엄격한 정의 순서로 필드에 액세스).

"record"라는 이름은 데이터베이스 용어에서 "records"(일명 행)의 표준 의미와 충돌 할 수 있으며 이러한 이유로 인해 이름이 필드 자체 목록으로 제안 될 수 있습니다.


1

왜이 두 개의 서로 다른 사업자는 않는다 [ ], 그리고 [[ ]]동일한 결과를 반환?

x = list(1, 2, 3, 4)
  1. [ ]하위 설정 작업을 제공합니다. 일반적으로 모든 객체의 하위 세트는 원래 객체와 동일한 유형을 갖습니다. 따라서 x[1] 목록을 제공합니다. 마찬가지로 x[1:2]원래 목록의 하위 집합이므로 목록입니다. 전의.

    x[1:2]
    
    [[1]] [1] 1
    
    [[2]] [1] 2
  2. [[ ]]목록에서 요소를 추출하기위한 것입니다. x[[1]]유효하고 목록에서 첫 번째 요소를 추출하십시오. 과 같은 하위 설정을 제공하지 x[[1:2]]않으므로 유효 [[ ]]하지 않습니다 [ ].

     x[[2]] [1] 2 
    
    > x[[2:3]] Error in x[[2:3]] : subscript out of bounds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.