programing

목록을 올바르게 사용하는 방법

padding 2023. 5. 13. 09:14
반응형

목록을 올바르게 사용하는 방법

간단한 배경:널리 사용되는 많은 (대부분의) 현대 프로그래밍 언어들은 특히, 적어도 한 줌의 ADT[추상적인 데이터 유형]를 공통적으로 가지고 있습니다.

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

  • list(순서가 지정된 값 모음) 및

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

언어에서 두 는 R 그로래언처음두서같구개다다니현으로 구현됩니다.character그리고.vector각각 다음과 같다.

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

의 한가는, 보의에기지제가▁to R의▁r.list(ADT의 이었습니다.dictionaryPython, Python »에서NSMutableDictionary C, 표목 C에에서hashRuby에서, Perl과 Ruby에서,object literalJavascript 등).

Python하여 생성합니다(에서는 " 예들어값파, "-에생게전자성달쌍함써로으파을로생다생사성는니를성합지자마서를키찬과가에이썬전썬이파▁for▁just값▁them(다생니합는which서▁to성or생▁(").dict것은 아니다.list):

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

은 파이썬R 수 예를 들어, 당고신마항사목찬다항액니로합세스지가에의목전그과리의은록썬이파목▁and다▁of▁list니▁the합액ary,▁diction세스▁just▁you▁r▁e▁access▁an▁items▁r▁you그리.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 그나 R.lists는 또한 다른 지도형 ADT와는 다릅니다(어쨌든 제가 배운 언어 중에서).이것은 S에 대한 초기 사양, 즉 데이터/통계 DSL(도메인 특정 언어)을 처음부터 설계하려는 의도의 결과인 것 같습니다.

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

일단은.lists R은 벡터와 마찬가지로 순서가 지정된 집합입니다(즉, 키는 순차 정수가 아닌 해시 가능한 값일 수 있음).거의 항상 다른 언어의 매핑 데이터 유형은 순서가 없습니다.

둘째,list될 수 . s를 도 마찬가지입니다. 사용자가 한 번도 통과하지 못했음에도 불구하고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의멤될않고같수지것, 약당그하한강로제는면너주컨다이고만렇게테려, 이신들른는있버가▁is▁s:강▁a로제▁s는▁coer▁it:ced▁container컨너주▁to▁primary이▁can▁the▁ad▁and▁of▁if테,면▁you▁another한.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로 인 정수들인가요? (만, 저는 그 할 수 . 의 것을 할 수 것입니다.) 기본로 1제 순까니정수입차는시하작? (생각에저, 렇예않우그면지이없수강유습니다을할제형런는리으는확수없다고라할니대신습이답는이름이▁(▁)제▁beginning▁just▁are수없강▁wouldn유습로니다이할제▁names을형런우?는▁defaultlist에의 호출이 있는 벡터로.unlist.)

  • 왜 이 두 운영자들은[],그리고.[[]]같은 결과를 반환하시겠습니까?

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

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

    x[1]

    x[[1]]

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

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

    x2 = list(1:4)

R 설명서(,?list )를 가리키지 마십시오. 주의 깊게 읽었는데 바로 위에서 암송한 유형의 질문에 대답하는 데 도움이 되지 않습니다.

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

질문의 마지막 부분을 다루기 위해, 그것이 정말로 사이의 차이를 지적하기 때문입니다.list그리고.vectorR:

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

x = 목록(1, 2, 3, 4), x2 = 목록(1:4)

목록은 각 요소로 다른 클래스를 포함할 수 있습니다. 첫 벡터,두 요소가 프레임 수 .이 경우 두 개의 다른 목록을 작성했습니다. x벡터를 길이는 1입니다. 길 인 가 1개 4벡 있 습 니 다 가 각 터 이 의 다 니 있 습 , ▁has ▁four ▁1 가x2를 가지고 . 즉, 길이가 4인 벡터 1개입니다.

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

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

R 목록은 각 인덱스 값이 모든 개체와 연결될 수 있다는 점에서 해시 맵 데이터 구조와 매우 유사합니다.다음은 세 가지 클래스(함수 포함)가 포함된 목록의 간단한 예입니다.

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

질문과 관련하여, 다음과 같은 예를 차례로 제시하겠습니다.

반환 문에 목록이 추가되면 목록이 반환됩니다.고려하다

 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> 

이름은 단순히 설정되지 않습니다.

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

그들은 같은 것을 반환하지 않습니다.당신의 예는 다음과 같습니다.

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

x[1]의 첫 번 째반요다니환합를소▁▁first의 첫 번째 요소를 합니다.x은 와같은것과 .x모든 스칼라는 길이 1의 벡터입니다.에 ㅠㅠㅠx[[1]]목록의 첫 번째 요소를 반환합니다.

마지막으로, 이 둘은 각각 4개의 스칼라를 포함하는 목록과 단일 요소(4개의 요소의 벡터)를 포함하는 목록을 만드는 것이 다릅니다.

질문의 일부를 참조해 보십시오.

색인화에 관한 이 기사는 다음과 같은 차이에 대한 질문을 다룹니다.[]그리고.[[]].

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

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

> x[[1]]
[1] 1

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

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

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

@Shane의 대답에 덧붙여, 동일한 결과를 얻고 싶다면, 다음을 시도해 보십시오.

x3 = as.list(1:4)

그것은 벡터를 강요합니다.1:4일람표에

여기에 한 가지만 더 추가하면 됩니다.

R에는 패키지의 Python dict와 동일한 데이터 구조가 있습니다.오픈 데이터 그룹의 블로그 게시물에서 이에 대해 읽을 수 있습니다.다음은 간단한 예입니다.

> 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

에서 용성측면서에사,서,에▁in,hash클래스는 목록과 매우 유사합니다.그러나 대규모 데이터셋의 경우 성능이 더 우수합니다.

당신은 말합니다:

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

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

이것은 매우 오래된 질문이지만, 제 생각에는 아무도 OP의 일부 우려 사항을 직접 언급하지 않았기 때문에 새로운 답변이 어느 정도 가치를 더할 수 있다고 생각합니다.

, 수용된 암시하는 와 같이,listR의 개체는 해시 맵이 아닙니다.파이썬과 유사점을 만들고 싶다면,list너도 알다시피, 파이썬에 더 가깝습니다.list s(으)로 표시됨)tuple실제로).

의 R RC은 R 대분의부내저에부장방는설식것다명더는(R 니좋 C 유형은의)).SEXP세 부분으로 있습니다 기적으로세부구로성됩니다으분본▁).다니구:됩.

  • 개체의 R 유형, 길이 및 기타 메타데이터를 선언하는 헤더.
  • 표준 C 힙 할당 배열인 데이터 부분(연속 메모리 블록);
  • 속성, 이것은 다른 R 객체에 대한 포인터의 이름이 지정된 링크 리스트입니다(또는NULL개체에 속성이 없는 경우).

내부적인 관점에서 볼 때, a 사이에는 거의 차이가 없습니다.list a 리고a.numeric예를 들어 벡터.그들이 저장하는 가치들은 다를 뿐입니다.앞에서 설명한 패러다임으로 두 개의 객체를 분해해 보겠습니다.

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

위해서x:

  • 이 " 에유다음같표이시다니됩과형이헤더다니표▁is됩▁the▁that시▁the▁say▁type▁will▁header"라고 쓰여 있을 것입니다.numeric(REALSXPC-side)에서, 길이는 10이고 다른 것들.
  • 데이터 부분은 10을 포함하는 배열이 될 것입니다.double가치.
  • 은 성은입니다.NULL개체에 아무것도 없기 때문입니다.

위해서y:

  • 이 " 에유다음같표이시다니됩과형이헤더다니표▁is됩▁the▁that시▁the▁say▁type▁will▁header"라고 쓰여 있을 것입니다.list(VECSXPC-side)에서, 길이는 2와 다른 것들.
  • 은 두 유형에 이 될 이며, 부개개두의분데대은에한이포 2인의터 SEXP에서 .runif(10)그리고.runif(3)각각 다음과 같다.
  • 은 성은입니다.NULL에 관해서는x.

▁so래▁diffe입니다.numeric와 a 터와alist은 게그바로입니다.numeric데이터 부분은 다음으로 구성됩니다.double값, 에의 경우list데이터 부분은 다른 R 객체에 대한 포인터 배열입니다.

이름은 어떻게 됩니까?이름은 객체에 할당할 수 있는 속성의 일부일 뿐입니다.아래의 개체를 살펴보겠습니다.

z <- list(a=1:3, b=LETTERS)
  • 이 " 에유다음같표이시다니됩과형이헤더다니표▁is됩▁the▁that시▁the▁say▁type▁will▁header"라고 쓰여 있을 것입니다.list(VECSXPC-side)에서, 길이는 2와 다른 것들.
  • 은 두 유형에 이 될 이며, 부개개두의분데대은에한이포 2인의터 SEXP에서 .1:3그리고.LETTERS각각 다음과 같다.
  • 속성이 가 됩니다.names 가 성분character값이 이 c("a","b").

에서 R 에서다사음개속검수있성다색니습할을체의여용하을준수로 의 속성을 검색할 수 .attributes기능.

R에서 해시 맵의 일반적인 키 값은 허상일 뿐입니다.다음과 같은 경우:

z[["a"]]

이렇게 됩니다.

  • 그자리의 [[부분 집합 함수를 호출합니다.
  • (함數, )"a"는 ) 유형입니다.character그래서 방법은 그러한 값을 검색하도록 지시됩니다.names)z;
  • names.NULL반환됨;
  • 경우, 면다있,"a"값이 검색됩니다.한다면"a".NULL반환됨;
  • 존재하는 경우 첫 번째 발생 위치가 결정됩니다(예: 1).따라서 목록의 첫 번째 요소, 즉, 다음과 같은 요소가 반환됩니다.z[[1]].

키 값 검색은 다소 간접적이며 항상 위치가 지정됩니다.또한 다음과 같은 사항도 염두에 두어야 합니다.

  • 해시 맵에서 키가 가져야 하는 유일한 제한은 해시 가능해야 한다는 것입니다. names에는 문자열R는문자열에(()이어야.character벡터);

  • 해시 맵에서는 두 개의 동일한 키를 가질 수 없습니다.R에서 다음을 할당할 수 있습니다.names반복되는 값을 가진 개체에 적용됩니다.예를 들어:

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

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

결론적으로, 어떤 사물에 임의적인 속성을 부여하는 능력은 당신에게 외부의 관점과는 다른 어떤 것의 모습을 제공합니다. R지만 R.lists는 어떤 식으로든 해시 맵이 아닙니다.

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)

이것은 꽤 오래된 질문이지만, R의 첫 단계에서 놓쳤던 지식, 즉 R의 객체로 내 손에 있는 데이터를 표현하는 방법 또는 기존 객체에서 선택하는 방법에 정확히 감동하고 있다고 말해야 합니다.R 초보자가 처음부터 "R 박스 안에서" 생각하는 것은 쉽지 않습니다.

그래서 저는 아래의 목발을 사용하기 시작했습니다. 어떤 데이터를 위해 어떤 물체를 사용해야 하는지, 그리고 기본적으로 실제 사용을 상상하는 데 많은 도움이 되었습니다.

제가 질문에 정확한 답을 주지는 않았지만, 아래의 짧은 텍스트는 R로 시작하고 유사한 질문을 하는 독자에게 도움이 될 수 있습니다.

  • 원자 벡터...저는 저 자신을 위해 "시퀀스"라고 불렀습니다. 방향이 없고, 단지 같은 종류의 시퀀스입니다. [부분 집합.
  • 벡터스... 에서 한 , 2D에서한방향의시퀀서에▁with,,[부분 집합.
  • 행열을 합니다. 행렬... 같은 길이의 벡터 다발이 행이나 열을 형성합니다.[행 및 열 또는 시퀀스별 부분 집합입니다.
  • 배열...3D를 형성하는 계층화된 행렬
  • 데이터 프레임... excel과 같은 2D 테이블에서 행이나 열을 정렬, 추가 또는 제거하거나 리터를 만들 수 있습니다.그들과의 운영, 얼마 후에야 나는 데이터 프레임이 영리한 구현이라는 것을 진정으로 인식했습니다.list다음을 사용하여 부분 집합을 설정할 수 있습니다.[로, 는 과열로를 사용하는 경우에도 그나사는하경우에도용러행▁by도경에우▁rows는▁using,▁but▁and,사.[[.
  • 나는 록목의 했습니다... 나는 스스로를 돕기 위해 목록에 대해 생각했습니다.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 벡터의 의 원자입니다.rpois(1e4,5)의 난수 (5개의 난수),numeric(55)), (더블 위의 길이-55 제로 벡터), (더블 위의 길이-55 제로 벡터),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의 질문 자체에서 볼 수 있는 다양한 데이터 유형이 포함될 수 있습니다.

저는 "arrays"가 변수 데이터 유형을 포함할 수 있는 언어(루비, 자바스크립트)를 본 적이 있지만, 예를 들어 C++의 "arrays"는 모두 동일한 데이터 유형이어야 합니다.저는 이것이 속도/효율성의 문제라고 생각합니다: 만약 당신이 그것을 가지고 있다면.numeric(1e6)당신은 그것의 크기와 모든 요소의 위치를 알고 있습니다; 만약 그것이 포함할 수 있다면."Flying Purple People Eaters"알려지지 않은 조각에서, 당신은 그것에 대한 기본적인 사실을 알기 위해 실제로 그것을 구문 분석해야 합니다.

특정 표준 R 연산은 유형이 보장되는 경우에도 더 의미가 있습니다.를 들어 를들면입니다.cumsum(1:9)이 되는 반면에 반에말이됩니다면▁makes다됩.cumsum(list(1,2,3,4,5,'a',6,7,8,9))그렇지 않습니다. 형식이 이중으로 보장되지 않습니다.


두 번째 질문과 관련하여:

함수를 호출할 때 목록을 전달하지 않았더라도 함수에서 목록을 반환할 수 있습니다.

함수는 항상 입력되는 것과 다른 데이터 유형을 반환합니다. plot플롯을 입력으로 사용하지 않더라도 플롯을 반환합니다. Arg를 반환합니다.numeric비록 그것이 a를 받아들였지만.complex 타기.

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

도움이 된다면 R의 "리스트"를 다른 OO 이전 언어의 "레코드"로 생각하는 경향이 있습니다.

  • 그들은 전체 유형(또는 사용 가능한 모든 배열 및 필드 이름의 가능한 레코드 유형)에 대해 어떠한 가정도 하지 않습니다.
  • 필드는 익명일 수 있습니다(엄격한 정의 순서로 액세스할 수 있습니다).

"record"라는 이름은 데이터베이스 용어로 "records"(일명 행)의 표준 의미와 충돌하며, 이러한 이유로 "records"의 이름이 (필드의) 목록으로 제안되었을 수 있습니다.

왜 이 두 운영자들은[ ],그리고.[[ ]]같은 결과를 반환하시겠습니까?

x = list(1, 2, 3, 4)
  1. [ ]하위 설정 작업을 제공합니다.일반적으로 모든 개체의 하위 집합은 원래 개체와 동일한 유형을 가집니다. 그므로러,x[1]목록을 제공합니다. 유하게사▁similarlyx[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
    

당신은 다음과 같은 것을 시도할 수 있습니다.

set.seed(123)
l <- replicate(20, runif(sample(1:10,1)), simplify = FALSE)

out <- vector("list", length(l))
for (i in seq_along(l)) {
  out[[i]] <- length(unique(l[[i]])) #length(l[[i]])
}
unlist(out)

unlist(lapply(l,length))
unlist(lapply(l, class))
unlist(lapply(l, mean))
unlist(lapply(l, max))

언급URL : https://stackoverflow.com/questions/2050790/how-to-correctly-use-lists

반응형