>>>>> William Dunlap <wdun...@tibco.com>
>>>>>     on Tue, 25 Aug 2015 09:47:23 -0700 writes:

    > match(x,table) and x%in%table work when x and table are lists of language
    > objects or expressions.  E.g.,

    > expression(quote(1+2), quote(log2(16))) %in% expression(3, quote(1+2), 
c(4L,5L,6L,7L))
    > #[1]  TRUE FALSE
    > list(quote(1+2), quote(log2(16))) %in% list(3, quote(1+2), c(4L,5L,6L,7L))
    > #[1]  TRUE FALSE
    > match(list(quote(1+2), quote(log2(16))),  list(3, quote(1+2), 
c(4L,5L,6L,7L)))
    > #[1]  2 NA

yes, or slightly more naturally for the first case,

 > expression(1+2, log2(16)) %in% expression(3, 1+2, c(4L,5L,6L,7L))
 [1]  TRUE FALSE


    > With your example data:
    > spList[1] %in% spList
    > #[1] TRUE
    > list(quote(foo)) %in% spList
    > #[1] TRUE
    > list(quote(nosuchsymbol)) %in% spList
    > #[1] FALSE

yes  indeed, that works because list()s and expression()s are
"vector"s in the wide sense, as "we all" know.

Did you support Ben's  wish to allow 'symbol' (aka 'name') objects as well,
or even more general language objects (as by the subject's wording) ?

Internally, in these cases the matches do happen with character
coerced objects eventually; still I'd tend to agree that allowing some of
these as arguments to match() in addition to the
wide-sense-vectors (and NULL !) would make sense.

Martin



    > Bill Dunlap
    > TIBCO Software
    > wdunlap tibco.com

    > On Tue, Aug 25, 2015 at 9:12 AM, Ben Bolker <bbol...@gmail.com> wrote:

    >> -----BEGIN PGP SIGNED MESSAGE-----
    >> Hash: SHA1
    >> 
    >> 
    >> I haven't yet dug into the internals of match() yet to see what's
    >> going on, but I'm wondering whether there's a design reason why I
    >> can't use %in% (which is a wrapper for match()) on language objects.
    >> 
    >> I'd like to test whether a language object is in a list of language
    >> objects, but I get the error "'match' requires vector arguments":
    >> 
    >> specials <- c("foo","bar")
    >> spList <- lapply(specials,as.name)  ## convert to language objects
    >> "a" %in% spList  ## works (FALSE)
    >> spList[[1]] %in% spList ##   'match' requires vector arguments
    >> quote(foo) %in% spList  ## ditto
    >> quote(foo) == spList[[1]]  ## TRUE
    >> 
    >> obviously I can go the other way, converting my target into text:
    >> 
    >> deparse(spList[[1]]) %in% specials  ## TRUE
    >> 
    >> I could also write my own function to loop through the list and stop
    >> when I find it.  But I'd prefer to use built-in functionality if 
possible.
    >> 
    >> Does anyone have any clues/see what I'm missing?
    >> 
    >> cheers
    >> Ben Bolker
    >> -----BEGIN PGP SIGNATURE-----
    >> Version: GnuPG v1.4.11 (GNU/Linux)
    >> 
    >> iQEcBAEBAgAGBQJV3JQLAAoJEOCV5YRblxUHTEkIAJluX0F2bLGW1jt1FP2UEZs1
    >> hucBzPGxpHdGE0CAE2Q2rPtKPmJsZdOpkpBPcxorLj4F6C70yY9QmdNlZ1i/spQB
    >> k33EbUsD2XZGcfIVRGSnc1q9QS2vcWRuyC89GRle8xPVD8MfwiV/EMQi4hBk1v9q
    >> TTOug7e1c+I+PtbvrQHpQrCc/1h609I7UqPCOdYbak3xwQC4VNSJ1A8n5w4N+RsV
    >> UVEMkOmhLnwzk6pSSC0dbyOKUluklc5ZYBX8aEM0Cd9bUYhoqc2aXUc7ocsL3f9J
    >> BHlDhy0kfjfwv4wqg/sFKLMIX2IQPxM2zrcd3v1hhEXOYGi7KoHHpZaihbFmEfQ=
    >> =w3OR
    >> -----END PGP SIGNATURE-----
    >> 
    >> ______________________________________________
    >> R-devel@r-project.org mailing list
    >> https://stat.ethz.ch/mailman/listinfo/r-devel
    >> 

    > [[alternative HTML version deleted]]

    > ______________________________________________
    > R-devel@r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to