The is.vector() thing has also bitten me in the behind on a few occasions. When I want to check if something is a vector, allow for it to possibly have some additional attributes (besides names) that would make is.vector() evaluate to FALSE, but evaluate to FALSE for lists (since is.vector(list(a=1, b=2)) is TRUE -- which also wasn't what I had initially expected before reading the documentation), I use: .is.vector <- function(x) is.atomic(x) && !is.matrix(x) && !is.null(x) This might also work: .is.vector <- function(x) is(x, "vector") && !is.list(x) I am sure there are all kinds of edge (and probably also not so edge) cases where these also fail to work properly. Kinda curious if there are better approaches out there. Best, Wolfgang>-----Original Message----- >From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Therneau, Terry >M., Ph.D. via R-help >Sent: Saturday, 10 April, 2021 16:12 >To: R-help >Subject: Re: [R] evil attributes > >I wrote: "I confess to being puzzled WHY the R core has decided on this >definition..." >After just a little more thought let me answer my own question. > >a. The as.vector() function is designed to strip off everything extraneous and >leave just >the core.?? (I have a mental image of Jack Webb saying "Just the facts >ma'am"). ? I myself >use it freqently in the test suite for survival, in cases where I'm checking the >corrent >numeric result and don't care about any attached names. > > ?b. is.vector(x) essentially answers the question "does x look like a result of >as.vector?" > >Nevertheless I understand Roger's confusion. > >-- >Terry M Therneau, PhD >Department of Quantitative Health Sciences >Mayo Clinic >therneau at mayo.edu > >"TERR-ree THUR-noh"
On 4/11/21 11:46 AM, Viechtbauer, Wolfgang (SP) wrote:> The is.vector() thing has also bitten me in the behind on a few occasions. When I want to check if something is a vector, allow for it to possibly have some additional attributes (besides names) that would make is.vector() evaluate to FALSE, but evaluate to FALSE for lists (since is.vector(list(a=1, b=2)) is TRUE -- which also wasn't what I had initially expected before reading the documentation), I use: > > .is.vector <- function(x) > is.atomic(x) && !is.matrix(x) && !is.null(x) > > This might also work: > > .is.vector <- function(x) > is(x, "vector") && !is.list(x)That will allow expression vectors to return TRUE, but they are not atomic so they would be excluded by your current version. -- David.> > I am sure there are all kinds of edge (and probably also not so edge) cases where these also fail to work properly. Kinda curious if there are better approaches out there.You might want to exclude expression vectors as well.> Best, > Wolfgang > >> -----Original Message----- >> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Therneau, Terry >> M., Ph.D. via R-help >> Sent: Saturday, 10 April, 2021 16:12 >> To: R-help >> Subject: Re: [R] evil attributes >> >> I wrote: "I confess to being puzzled WHY the R core has decided on this >> definition..." >> After just a little more thought let me answer my own question. >> >> a. The as.vector() function is designed to strip off everything extraneous and >> leave just >> the core.?? (I have a mental image of Jack Webb saying "Just the facts >> ma'am"). ? I myself >> use it freqently in the test suite for survival, in cases where I'm checking the >> corrent >> numeric result and don't care about any attached names. >> >> ?b. is.vector(x) essentially answers the question "does x look like a result of >> as.vector?" >> >> Nevertheless I understand Roger's confusion. >> >> -- >> Terry M Therneau, PhD >> Department of Quantitative Health Sciences >> Mayo Clinic >> therneau at mayo.edu >> >> "TERR-ree THUR-noh" > ______________________________________________ > 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 11/04/2021 2:46 p.m., Viechtbauer, Wolfgang (SP) wrote:> The is.vector() thing has also bitten me in the behind on a few occasions. When I want to check if something is a vector, allow for it to possibly have some additional attributes (besides names) that would make is.vector() evaluate to FALSE, but evaluate to FALSE for lists (since is.vector(list(a=1, b=2)) is TRUE -- which also wasn't what I had initially expected before reading the documentation), I use: > > .is.vector <- function(x) > is.atomic(x) && !is.matrix(x) && !is.null(x) > > This might also work: > > .is.vector <- function(x) > is(x, "vector") && !is.list(x) > > I am sure there are all kinds of edge (and probably also not so edge) cases where these also fail to work properly. Kinda curious if there are better approaches out there.Sorry, but nobody has said what "properly" would be here. How can an approach be better at something if you don't say what you want it to do? The base::is.vector() definition looks fairly useless, and I can't remember ever using that function. But at least it's quite well documented what it is supposed to do. What claims are you making about your .is.vector() definitions? Duncan Murdoch