R Error in x$ed : $ operator is invalid for atomic vectors

前端 未结 6 1579
野的像风
野的像风 2020-11-29 17:45

Here is my code:

x<-c(1,2)
x
names(x)<- c(\"bob\",\"ed\")
x$ed

Why do I get the following error?

Error in x$ed

相关标签:
6条回答
  • 2020-11-29 17:53

    The reason you are getting this error is that you have a vector.

    If you want to use the $ operator, you simply need to convert it to a data.frame. But since you only have one row in this particular case, you would also need to transpose it; otherwise bob and ed will become your row names instead of your column names which is what I think you want.

    x <- c(1, 2)
    x
    names(x) <- c("bob", "ed")
    x <- as.data.frame(t(x))
    x$ed
    [1] 2
    
    0 讨论(0)
  • 2020-11-29 17:57

    Because $ does not work on atomic vectors. Use [ or [[ instead. From the help file for $:

    The default methods work somewhat differently for atomic vectors, matrices/arrays and for recursive (list-like, see is.recursive) objects. $ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

    x[["ed"]] will work.

    0 讨论(0)
  • 2020-11-29 17:59

    Here x is a vector. You need to convert it into a dataframe for using $ operator.

     x <- as.data.frame(x) 
    

    will work for you.

    x<-c(1,2)
    names(x)<- c("bob","ed")
    x <- as.data.frame(x)
    

    will give you output of x as:
    bob 1
    ed 2
    And, will give you output of x$ed as:
    NULL
    If you want bob and ed as column names then you need to transpose the dataframe like x <- as.data.frame(t(x)) So your code becomes

    x<-c(1,2)
    x
    names(x)<- c("bob","ed")
    x$ed
    x <- as.data.frame(t(x))
    

    Now the output of x$ed is:
    [1] 2

    0 讨论(0)
  • 2020-11-29 18:01

    Atomic collections are accessible by $

    Recursive collections are not. Rather the [[ ]] is used

     Browse[1]> is.atomic(list())
     [1] FALSE
    
     Browse[1]> is.atomic(data.frame())
     [1] FALSE
    
     Browse[1]> is.atomic(class(list(foo="bar")))
     [1] TRUE
    
     Browse[1]> is.atomic(c(" lang "))
     [1] TRUE
    

    R can be funny sometimes

     a = list(1,2,3)
     b = data.frame(a)
     d = rbind("?",c(b))
     e = exp(1)
     f = list(d)
     print(data.frame(c(list(f,e))))
    
       X1 X2 X3 X2.71828182845905
     1  ?  ?  ?          2.718282
     2  1  2  3          2.718282
    
    0 讨论(0)
  • 2020-11-29 18:06

    You get this error, despite everything being in line, because of a conflict caused by one of the packages that are currently loaded in your R environment.

    So, to solve this issue, detach all the packages that are not needed from the R environment. For example, when I had the same issue, I did the following:

    detach(package:neuralnet)
    

    bottom line: detach all the libraries no longer needed for execution... and the problem will be solved.

    0 讨论(0)
  • 2020-11-29 18:16

    From the help file about $ (See ?"$") you can read:

    $ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

    Now, let's check whether x is recursive

    > is.recursive(x)
    [1] FALSE
    

    A recursive object has a list-like structure. A vector is not recursive, it is an atomic object instead, let's check

    > is.atomic(x)
    [1] TRUE
    

    Therefore you get an error when applying $ to a vector (non-recursive object), use [ instead:

    > x["ed"]
    ed 
     2 
    

    You can also use getElement

    > getElement(x, "ed")
    [1] 2
    
    0 讨论(0)
提交回复
热议问题