OK, I stand somewhat chastised. But my point still is that what you get when you "extract" depends on how you define "extract." Do note that ?"[" yields a help file titled "Extract or Replace Parts of an object"; and afaics, the term "subset" is not explicitly used as Duncan prefers. The relevant part of the Help file says for "[" for recursive objects says: "Indexing by [ is similar to atomic vectors and selects a list of the specified element(s)." That a data.frame is a list is explicitly stated, as I noted; that lists are in fact vectors is also explicitly stated (?list says: "Almost all lists in R internally are Generic Vectors") but then one is stuck with: a data.frame is a list and therefore a vector, but is.vector(d3) is FALSE. The explanation is explicit again in ?is.vector ("is.vector returns TRUE if x is a vector of the specified mode having no attributes other than names. It returns FALSE otherwise."). But I would say these issues are sufficiently murky that my warning to be precise is not entirely inappropriate; unfortunately, I may have made them more so. Sigh.... Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Fri, Jul 9, 2021 at 3:05 PM Duncan Murdoch <murdoch.duncan at gmail.com> wrote:> > On 09/07/2021 5:51 p.m., Jeff Newmiller wrote: > > "Strictly speaking", Greg is correct, Bert. > > > > https://cran.r-project.org/doc/manuals/r-release/R-lang.html#List-objects > > > > Lists in R are vectors. What we colloquially refer to as "vectors" are more precisely referred to as "atomic vectors". And without a doubt, this "vector" nature of lists is a key underlying concept that explains why adding a dim attribute creates a matrix that can hold data frames. It is also a stumbling block for programmers from other languages that have things like linked lists. > > I would also object to v3 (below) as "extracting" a column from d. > "d[2]" doesn't extract anything, it "subsets" the data frame, so the > result is a data frame, not what you get when you extract something from > a data frame. > > People don't realize that "x <- 1:10; y <- x[[3]]" is perfectly legal. > That extracts the 3rd element (the number 3). The problem is that R has > no way to represent a scalar number, only a vector of numbers, so x[[3]] > gets promoted to a vector containing that number when it is returned and > assigned to y. > > Lists are vectors of R objects, so if x is a list, x[[3]] is something > that can be returned, and it is different from x[3]. > > Duncan Murdoch > > > > > On July 9, 2021 2:36:19 PM PDT, Bert Gunter <bgunter.4567 at gmail.com> wrote: > >> "1. a column, when extracted from a data frame, *is* a vector." > >> Strictly speaking, this is false; it depends on exactly what is meant > >> by "extracted." e.g.: > >> > >>> d <- data.frame(col1 = 1:3, col2 = letters[1:3]) > >>> v1 <- d[,2] ## a vector > >>> v2 <- d[[2]] ## the same, i.e > >>> identical(v1,v2) > >> [1] TRUE > >>> v3 <- d[2] ## a data.frame > >>> v1 > >> [1] "a" "b" "c" ## a character vector > >>> v3 > >> col2 > >> 1 a > >> 2 b > >> 3 c > >>> is.vector(v1) > >> [1] TRUE > >>> is.vector(v3) > >> [1] FALSE > >>> class(v3) ## data.frame > >> [1] "data.frame" > >> ## but > >>> is.list(v3) > >> [1] TRUE > >> > >> which is simply explained in ?data.frame (where else?!) by: > >> "A data frame is a **list** [emphasis added] of variables of the same > >> number of rows with unique row names, given class "data.frame". If no > >> variables are included, the row names determine the number of rows." > >> > >> "2. maybe your question is "is a given function for a vector, or for a > >> data frame/matrix/array?". if so, i think the only way is reading > >> the help information (?foo)." > >> > >> Indeed! Is this not what the Help system is for?! But note also that > >> the S3 class system may somewhat blur the issue: foo() may work > >> appropriately and differently for different (S3) classes of objects. A > >> detailed explanation of this behavior can be found in appropriate > >> resources or (more tersely) via ?UseMethod . > >> > >> "you might find reading ?"[" and ?"[.data.frame" useful" > >> > >> Not just 'useful" -- **essential** if you want to work in R, unless > >> one gets this information via any of the numerous online tutorials, > >> courses, or books that are available. The Help system is accurate and > >> authoritative, but terse. I happen to like this mode of documentation, > >> but others may prefer more extended expositions. I stand by this claim > >> even if one chooses to use the "Tidyverse", data.table package, or > >> other alternative frameworks for handling data. Again, others may > >> disagree, but R is structured around these basics, and imo one remains > >> ignorant of them at their peril. > >> > >> Cheers, > >> Bert > >> > >> > >> Bert Gunter > >> > >> "The trouble with having an open mind is that people keep coming along > >> and sticking things into it." > >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > >> > >> On Fri, Jul 9, 2021 at 11:57 AM Greg Minshall <minshall at umich.edu> > >> wrote: > >>> > >>> Kai, > >>> > >>>> one more question, how can I know if the function is for column > >>>> manipulations or for vector? > >>> > >>> i still stumble around R code. but, i'd say the following (and look > >>> forward to being corrected! :): > >>> > >>> 1. a column, when extracted from a data frame, *is* a vector. > >>> > >>> 2. maybe your question is "is a given function for a vector, or for > >> a > >>> data frame/matrix/array?". if so, i think the only way is > >> reading > >>> the help information (?foo). > >>> > >>> 3. sometimes, extracting the column as a vector from a data > >> frame-like > >>> object might be non-intuitive. you might find reading ?"[" and > >>> ?"[.data.frame" useful (as well as ?"[.data.table" if you use > >> that > >>> package). also, the str() command can be helpful in > >> understanding > >>> what is happening. (the lobstr:: package's sxp() function, as > >> well > >>> as more verbose .Internal(inspect()) can also give you insight.) > >>> > >>> with the data.table:: package, for example, if "DT" is a > >> data.table > >>> object, with "x2" as a column, adding or leaving off quotation > >> marks > >>> for the column name can make all the difference between ending up > >>> with a vector, or with a (much reduced) data table: > >>> ---- > >>>> is.vector(DT[, x2]) > >>> [1] TRUE > >>>> str(DT[, x2]) > >>> num [1:9] 32 32 32 32 32 32 32 32 32 > >>>> > >>>> is.vector(DT[, "x2"]) > >>> [1] FALSE > >>>> str(DT[, "x2"]) > >>> Classes ?data.table? and 'data.frame': 9 obs. of 1 variable: > >>> $ x2: num 32 32 32 32 32 32 32 32 32 > >>> - attr(*, ".internal.selfref")=<externalptr> > >>> ---- > >>> > >>> a second level of indexing may or may not help, mostly depending > >> on > >>> the use of '[' versus of '[['. this can sometimes cause > >> confusion > >>> when you are learning the language. > >>> ---- > >>>> str(DT[, "x2"][1]) > >>> Classes ?data.table? and 'data.frame': 1 obs. of 1 variable: > >>> $ x2: num 32 > >>> - attr(*, ".internal.selfref")=<externalptr> > >>>> str(DT[, "x2"][[1]]) > >>> num [1:9] 32 32 32 32 32 32 32 32 32 > >>> ---- > >>> > >>> the tibble:: package (used in, e.g., the dplyr:: package) also > >>> (always?) returns a single column as a non-vector. again, a > >>> second indexing with double '[[]]' can produce a vector. > >>> ---- > >>>> DP <- tibble(DT) > >>>> is.vector(DP[, "x2"]) > >>> [1] FALSE > >>>> is.vector(DP[, "x2"][[1]]) > >>> [1] TRUE > >>> ---- > >>> > >>> but, note that a list of lists is also a vector: > >>>> is.vector(list(list(1), list(1,2,3))) > >>> [1] TRUE > >>>> str(list(list(1), list(1,2,3))) > >>> List of 2 > >>> $ :List of 1 > >>> ..$ : num 1 > >>> $ :List of 3 > >>> ..$ : num 1 > >>> ..$ : num 2 > >>> ..$ : num 3 > >>> > >>> etc. > >>> > >>> hth. good luck learning! > >>> > >>> cheers, Greg > >>> > >>> ______________________________________________ > >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >>> https://stat.ethz.ch/mailman/listinfo/r-help > >>> PLEASE do read the posting guide > >> http://www.R-project.org/posting-guide.html > >>> and provide commented, minimal, self-contained, reproducible code. > >> > >> ______________________________________________ > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide > >> http://www.R-project.org/posting-guide.html > >> and provide commented, minimal, self-contained, reproducible code. > > >
On 09/07/2021 6:44 p.m., Bert Gunter wrote:> OK, I stand somewhat chastised. > > But my point still is that what you get when you "extract" depends on > how you define "extract." Do note that ?"[" yields a help file titled > "Extract or Replace Parts of an object"; and afaics, the term "subset" > is not explicitly used as Duncan prefers.?"[[" gives you the same page, but I agree: this part of the documentation isn't written very clearly. The "Introduction to R" manual uses the terms I used (see section 2.7, "Index vectors; selecting and modifying subsets of a data set"), as does the source code (and the R Language Definition manual, though it's not as clear as the Intro). But the point isn't to chastise you, it's to educate you (and the OP). Thinking of [] as subsetting is more helpful than thinking of it as extraction. That way the result of x[c(1,2)] makes sense. It's a little bit more of a stretch, but the result of x[[c(1,2)]] also makes sense when you think of it as extraction. Duncan Murdoch The relevant part of the> Help file says for "[" for recursive objects says: "Indexing by [ is > similar to atomic vectors and selects a list of the specified > element(s)." That a data.frame is a list is explicitly stated, as I > noted; that lists are in fact vectors is also explicitly stated (?list > says: "Almost all lists in R internally are Generic Vectors") but then > one is stuck with: a data.frame is a list and therefore a vector, but > is.vector(d3) is FALSE. The explanation is explicit again in > ?is.vector ("is.vector returns TRUE if x is a vector of the specified > mode having no attributes other than names. It returns FALSE > otherwise."). But I would say these issues are sufficiently murky that > my warning to be precise is not entirely inappropriate; unfortunately, > I may have made them more so. Sigh.... > > Cheers, > Bert > > > > Bert Gunter > > "The trouble with having an open mind is that people keep coming along > and sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > On Fri, Jul 9, 2021 at 3:05 PM Duncan Murdoch <murdoch.duncan at gmail.com> wrote: >> >> On 09/07/2021 5:51 p.m., Jeff Newmiller wrote: >>> "Strictly speaking", Greg is correct, Bert. >>> >>> https://cran.r-project.org/doc/manuals/r-release/R-lang.html#List-objects >>> >>> Lists in R are vectors. What we colloquially refer to as "vectors" are more precisely referred to as "atomic vectors". And without a doubt, this "vector" nature of lists is a key underlying concept that explains why adding a dim attribute creates a matrix that can hold data frames. It is also a stumbling block for programmers from other languages that have things like linked lists. >> >> I would also object to v3 (below) as "extracting" a column from d. >> "d[2]" doesn't extract anything, it "subsets" the data frame, so the >> result is a data frame, not what you get when you extract something from >> a data frame. >> >> People don't realize that "x <- 1:10; y <- x[[3]]" is perfectly legal. >> That extracts the 3rd element (the number 3). The problem is that R has >> no way to represent a scalar number, only a vector of numbers, so x[[3]] >> gets promoted to a vector containing that number when it is returned and >> assigned to y. >> >> Lists are vectors of R objects, so if x is a list, x[[3]] is something >> that can be returned, and it is different from x[3]. >> >> Duncan Murdoch >> >>> >>> On July 9, 2021 2:36:19 PM PDT, Bert Gunter <bgunter.4567 at gmail.com> wrote: >>>> "1. a column, when extracted from a data frame, *is* a vector." >>>> Strictly speaking, this is false; it depends on exactly what is meant >>>> by "extracted." e.g.: >>>> >>>>> d <- data.frame(col1 = 1:3, col2 = letters[1:3]) >>>>> v1 <- d[,2] ## a vector >>>>> v2 <- d[[2]] ## the same, i.e >>>>> identical(v1,v2) >>>> [1] TRUE >>>>> v3 <- d[2] ## a data.frame >>>>> v1 >>>> [1] "a" "b" "c" ## a character vector >>>>> v3 >>>> col2 >>>> 1 a >>>> 2 b >>>> 3 c >>>>> is.vector(v1) >>>> [1] TRUE >>>>> is.vector(v3) >>>> [1] FALSE >>>>> class(v3) ## data.frame >>>> [1] "data.frame" >>>> ## but >>>>> is.list(v3) >>>> [1] TRUE >>>> >>>> which is simply explained in ?data.frame (where else?!) by: >>>> "A data frame is a **list** [emphasis added] of variables of the same >>>> number of rows with unique row names, given class "data.frame". If no >>>> variables are included, the row names determine the number of rows." >>>> >>>> "2. maybe your question is "is a given function for a vector, or for a >>>> data frame/matrix/array?". if so, i think the only way is reading >>>> the help information (?foo)." >>>> >>>> Indeed! Is this not what the Help system is for?! But note also that >>>> the S3 class system may somewhat blur the issue: foo() may work >>>> appropriately and differently for different (S3) classes of objects. A >>>> detailed explanation of this behavior can be found in appropriate >>>> resources or (more tersely) via ?UseMethod . >>>> >>>> "you might find reading ?"[" and ?"[.data.frame" useful" >>>> >>>> Not just 'useful" -- **essential** if you want to work in R, unless >>>> one gets this information via any of the numerous online tutorials, >>>> courses, or books that are available. The Help system is accurate and >>>> authoritative, but terse. I happen to like this mode of documentation, >>>> but others may prefer more extended expositions. I stand by this claim >>>> even if one chooses to use the "Tidyverse", data.table package, or >>>> other alternative frameworks for handling data. Again, others may >>>> disagree, but R is structured around these basics, and imo one remains >>>> ignorant of them at their peril. >>>> >>>> Cheers, >>>> Bert >>>> >>>> >>>> Bert Gunter >>>> >>>> "The trouble with having an open mind is that people keep coming along >>>> and sticking things into it." >>>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >>>> >>>> On Fri, Jul 9, 2021 at 11:57 AM Greg Minshall <minshall at umich.edu> >>>> wrote: >>>>> >>>>> Kai, >>>>> >>>>>> one more question, how can I know if the function is for column >>>>>> manipulations or for vector? >>>>> >>>>> i still stumble around R code. but, i'd say the following (and look >>>>> forward to being corrected! :): >>>>> >>>>> 1. a column, when extracted from a data frame, *is* a vector. >>>>> >>>>> 2. maybe your question is "is a given function for a vector, or for >>>> a >>>>> data frame/matrix/array?". if so, i think the only way is >>>> reading >>>>> the help information (?foo). >>>>> >>>>> 3. sometimes, extracting the column as a vector from a data >>>> frame-like >>>>> object might be non-intuitive. you might find reading ?"[" and >>>>> ?"[.data.frame" useful (as well as ?"[.data.table" if you use >>>> that >>>>> package). also, the str() command can be helpful in >>>> understanding >>>>> what is happening. (the lobstr:: package's sxp() function, as >>>> well >>>>> as more verbose .Internal(inspect()) can also give you insight.) >>>>> >>>>> with the data.table:: package, for example, if "DT" is a >>>> data.table >>>>> object, with "x2" as a column, adding or leaving off quotation >>>> marks >>>>> for the column name can make all the difference between ending up >>>>> with a vector, or with a (much reduced) data table: >>>>> ---- >>>>>> is.vector(DT[, x2]) >>>>> [1] TRUE >>>>>> str(DT[, x2]) >>>>> num [1:9] 32 32 32 32 32 32 32 32 32 >>>>>> >>>>>> is.vector(DT[, "x2"]) >>>>> [1] FALSE >>>>>> str(DT[, "x2"]) >>>>> Classes ?data.table? and 'data.frame': 9 obs. of 1 variable: >>>>> $ x2: num 32 32 32 32 32 32 32 32 32 >>>>> - attr(*, ".internal.selfref")=<externalptr> >>>>> ---- >>>>> >>>>> a second level of indexing may or may not help, mostly depending >>>> on >>>>> the use of '[' versus of '[['. this can sometimes cause >>>> confusion >>>>> when you are learning the language. >>>>> ---- >>>>>> str(DT[, "x2"][1]) >>>>> Classes ?data.table? and 'data.frame': 1 obs. of 1 variable: >>>>> $ x2: num 32 >>>>> - attr(*, ".internal.selfref")=<externalptr> >>>>>> str(DT[, "x2"][[1]]) >>>>> num [1:9] 32 32 32 32 32 32 32 32 32 >>>>> ---- >>>>> >>>>> the tibble:: package (used in, e.g., the dplyr:: package) also >>>>> (always?) returns a single column as a non-vector. again, a >>>>> second indexing with double '[[]]' can produce a vector. >>>>> ---- >>>>>> DP <- tibble(DT) >>>>>> is.vector(DP[, "x2"]) >>>>> [1] FALSE >>>>>> is.vector(DP[, "x2"][[1]]) >>>>> [1] TRUE >>>>> ---- >>>>> >>>>> but, note that a list of lists is also a vector: >>>>>> is.vector(list(list(1), list(1,2,3))) >>>>> [1] TRUE >>>>>> str(list(list(1), list(1,2,3))) >>>>> List of 2 >>>>> $ :List of 1 >>>>> ..$ : num 1 >>>>> $ :List of 3 >>>>> ..$ : num 1 >>>>> ..$ : num 2 >>>>> ..$ : num 3 >>>>> >>>>> etc. >>>>> >>>>> hth. good luck learning! >>>>> >>>>> cheers, Greg >>>>> >>>>> ______________________________________________ >>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>> PLEASE do read the posting guide >>>> http://www.R-project.org/posting-guide.html >>>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>>> ______________________________________________ >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide >>>> http://www.R-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code. >>> >>
My mental model for the `[` vs `[[` behavior is that `[` indexes multiple results while `[[` indexes only one item. If returning multiple items from a list the result must be a list. For consistency, `[` always returns a list when applied to a list. The double bracket drops the containing list. The is.vector() behavior is not intuitive to me... I avoid that function, as I think it is more useful to think of lists as vectors than as something "other". On July 9, 2021 3:44:29 PM PDT, Bert Gunter <bgunter.4567 at gmail.com> wrote:>OK, I stand somewhat chastised. > >But my point still is that what you get when you "extract" depends on >how you define "extract." Do note that ?"[" yields a help file titled >"Extract or Replace Parts of an object"; and afaics, the term "subset" >is not explicitly used as Duncan prefers. The relevant part of the >Help file says for "[" for recursive objects says: "Indexing by [ is >similar to atomic vectors and selects a list of the specified >element(s)." That a data.frame is a list is explicitly stated, as I >noted; that lists are in fact vectors is also explicitly stated (?list >says: "Almost all lists in R internally are Generic Vectors") but then >one is stuck with: a data.frame is a list and therefore a vector, but >is.vector(d3) is FALSE. The explanation is explicit again in >?is.vector ("is.vector returns TRUE if x is a vector of the specified >mode having no attributes other than names. It returns FALSE >otherwise."). But I would say these issues are sufficiently murky that >my warning to be precise is not entirely inappropriate; unfortunately, >I may have made them more so. Sigh.... > >Cheers, >Bert > > > >Bert Gunter > >"The trouble with having an open mind is that people keep coming along >and sticking things into it." >-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > >On Fri, Jul 9, 2021 at 3:05 PM Duncan Murdoch ><murdoch.duncan at gmail.com> wrote: >> >> On 09/07/2021 5:51 p.m., Jeff Newmiller wrote: >> > "Strictly speaking", Greg is correct, Bert. >> > >> > >https://cran.r-project.org/doc/manuals/r-release/R-lang.html#List-objects >> > >> > Lists in R are vectors. What we colloquially refer to as "vectors" >are more precisely referred to as "atomic vectors". And without a >doubt, this "vector" nature of lists is a key underlying concept that >explains why adding a dim attribute creates a matrix that can hold data >frames. It is also a stumbling block for programmers from other >languages that have things like linked lists. >> >> I would also object to v3 (below) as "extracting" a column from d. >> "d[2]" doesn't extract anything, it "subsets" the data frame, so the >> result is a data frame, not what you get when you extract something >from >> a data frame. >> >> People don't realize that "x <- 1:10; y <- x[[3]]" is perfectly >legal. >> That extracts the 3rd element (the number 3). The problem is that R >has >> no way to represent a scalar number, only a vector of numbers, so >x[[3]] >> gets promoted to a vector containing that number when it is returned >and >> assigned to y. >> >> Lists are vectors of R objects, so if x is a list, x[[3]] is >something >> that can be returned, and it is different from x[3]. >> >> Duncan Murdoch >> >> > >> > On July 9, 2021 2:36:19 PM PDT, Bert Gunter ><bgunter.4567 at gmail.com> wrote: >> >> "1. a column, when extracted from a data frame, *is* a vector." >> >> Strictly speaking, this is false; it depends on exactly what is >meant >> >> by "extracted." e.g.: >> >> >> >>> d <- data.frame(col1 = 1:3, col2 = letters[1:3]) >> >>> v1 <- d[,2] ## a vector >> >>> v2 <- d[[2]] ## the same, i.e >> >>> identical(v1,v2) >> >> [1] TRUE >> >>> v3 <- d[2] ## a data.frame >> >>> v1 >> >> [1] "a" "b" "c" ## a character vector >> >>> v3 >> >> col2 >> >> 1 a >> >> 2 b >> >> 3 c >> >>> is.vector(v1) >> >> [1] TRUE >> >>> is.vector(v3) >> >> [1] FALSE >> >>> class(v3) ## data.frame >> >> [1] "data.frame" >> >> ## but >> >>> is.list(v3) >> >> [1] TRUE >> >> >> >> which is simply explained in ?data.frame (where else?!) by: >> >> "A data frame is a **list** [emphasis added] of variables of the >same >> >> number of rows with unique row names, given class "data.frame". If >no >> >> variables are included, the row names determine the number of >rows." >> >> >> >> "2. maybe your question is "is a given function for a vector, or >for a >> >> data frame/matrix/array?". if so, i think the only way is >reading >> >> the help information (?foo)." >> >> >> >> Indeed! Is this not what the Help system is for?! But note also >that >> >> the S3 class system may somewhat blur the issue: foo() may work >> >> appropriately and differently for different (S3) classes of >objects. A >> >> detailed explanation of this behavior can be found in appropriate >> >> resources or (more tersely) via ?UseMethod . >> >> >> >> "you might find reading ?"[" and ?"[.data.frame" useful" >> >> >> >> Not just 'useful" -- **essential** if you want to work in R, >unless >> >> one gets this information via any of the numerous online >tutorials, >> >> courses, or books that are available. The Help system is accurate >and >> >> authoritative, but terse. I happen to like this mode of >documentation, >> >> but others may prefer more extended expositions. I stand by this >claim >> >> even if one chooses to use the "Tidyverse", data.table package, or >> >> other alternative frameworks for handling data. Again, others may >> >> disagree, but R is structured around these basics, and imo one >remains >> >> ignorant of them at their peril. >> >> >> >> Cheers, >> >> Bert >> >> >> >> >> >> Bert Gunter >> >> >> >> "The trouble with having an open mind is that people keep coming >along >> >> and sticking things into it." >> >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> >> On Fri, Jul 9, 2021 at 11:57 AM Greg Minshall <minshall at umich.edu> >> >> wrote: >> >>> >> >>> Kai, >> >>> >> >>>> one more question, how can I know if the function is for column >> >>>> manipulations or for vector? >> >>> >> >>> i still stumble around R code. but, i'd say the following (and >look >> >>> forward to being corrected! :): >> >>> >> >>> 1. a column, when extracted from a data frame, *is* a vector. >> >>> >> >>> 2. maybe your question is "is a given function for a vector, or >for >> >> a >> >>> data frame/matrix/array?". if so, i think the only way is >> >> reading >> >>> the help information (?foo). >> >>> >> >>> 3. sometimes, extracting the column as a vector from a data >> >> frame-like >> >>> object might be non-intuitive. you might find reading ?"[" >and >> >>> ?"[.data.frame" useful (as well as ?"[.data.table" if you >use >> >> that >> >>> package). also, the str() command can be helpful in >> >> understanding >> >>> what is happening. (the lobstr:: package's sxp() function, >as >> >> well >> >>> as more verbose .Internal(inspect()) can also give you >insight.) >> >>> >> >>> with the data.table:: package, for example, if "DT" is a >> >> data.table >> >>> object, with "x2" as a column, adding or leaving off >quotation >> >> marks >> >>> for the column name can make all the difference between >ending up >> >>> with a vector, or with a (much reduced) data table: >> >>> ---- >> >>>> is.vector(DT[, x2]) >> >>> [1] TRUE >> >>>> str(DT[, x2]) >> >>> num [1:9] 32 32 32 32 32 32 32 32 32 >> >>>> >> >>>> is.vector(DT[, "x2"]) >> >>> [1] FALSE >> >>>> str(DT[, "x2"]) >> >>> Classes ?data.table? and 'data.frame': 9 obs. of 1 variable: >> >>> $ x2: num 32 32 32 32 32 32 32 32 32 >> >>> - attr(*, ".internal.selfref")=<externalptr> >> >>> ---- >> >>> >> >>> a second level of indexing may or may not help, mostly >depending >> >> on >> >>> the use of '[' versus of '[['. this can sometimes cause >> >> confusion >> >>> when you are learning the language. >> >>> ---- >> >>>> str(DT[, "x2"][1]) >> >>> Classes ?data.table? and 'data.frame': 1 obs. of 1 variable: >> >>> $ x2: num 32 >> >>> - attr(*, ".internal.selfref")=<externalptr> >> >>>> str(DT[, "x2"][[1]]) >> >>> num [1:9] 32 32 32 32 32 32 32 32 32 >> >>> ---- >> >>> >> >>> the tibble:: package (used in, e.g., the dplyr:: package) >also >> >>> (always?) returns a single column as a non-vector. again, a >> >>> second indexing with double '[[]]' can produce a vector. >> >>> ---- >> >>>> DP <- tibble(DT) >> >>>> is.vector(DP[, "x2"]) >> >>> [1] FALSE >> >>>> is.vector(DP[, "x2"][[1]]) >> >>> [1] TRUE >> >>> ---- >> >>> >> >>> but, note that a list of lists is also a vector: >> >>>> is.vector(list(list(1), list(1,2,3))) >> >>> [1] TRUE >> >>>> str(list(list(1), list(1,2,3))) >> >>> List of 2 >> >>> $ :List of 1 >> >>> ..$ : num 1 >> >>> $ :List of 3 >> >>> ..$ : num 1 >> >>> ..$ : num 2 >> >>> ..$ : num 3 >> >>> >> >>> etc. >> >>> >> >>> hth. good luck learning! >> >>> >> >>> cheers, Greg >> >>> >> >>> ______________________________________________ >> >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> >>> https://stat.ethz.ch/mailman/listinfo/r-help >> >>> PLEASE do read the posting guide >> >> http://www.R-project.org/posting-guide.html >> >>> and provide commented, minimal, self-contained, reproducible >code. >> >> >> >> ______________________________________________ >> >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> >> https://stat.ethz.ch/mailman/listinfo/r-help >> >> PLEASE do read the posting guide >> >> http://www.R-project.org/posting-guide.html >> >> and provide commented, minimal, self-contained, reproducible code. >> > >>-- Sent from my phone. Please excuse my brevity.