$ operator is invalid for atomic vectors – R Error


In R language, you get the error, “$ operator is invalid for atomic vectors” when you try to apply $ to a non-recursive object. As in the R language documentation

The form using $ applies to recursive objects such as lists and pairlists. It allows only a literal character string or a symbol as the index. That is, the index is not computable: for cases where you need to evaluate an expression to find the index, use x[[expr]]. Applying $ to a non-recursive object is an error.

So, for atomic vectors, you should use x[i] notation. Check this code –

> x <- rnorm(5)
> x
[1] -0.12526937 -0.27961154 -1.03718717 -0.08156527  1.37167090
> x[2]
[1] -0.2796115

If it’s a list, then you can use x$a or x[[i]] notation. Check the code below –

> x <- list("Red", "Green", c(21,32,11), TRUE, 51.23, 119.1)
> x[[2]]
[1] Green
> names(x) <- c("red_color", "green_color", "vector_", "bool_", "float_51_23", "fload_119_1")
> x$`green_color`
[1] Green

Check if vector is atomic or recursive

If you have doubts whether your declared vector is atomic or recursive, you can use is.recursive(x) and is.atomic(x)

> x <- rnorm(5)
> is.recursive(x)
> is.atomic(x)
[1] TRUE

Convert vector to list

You can also convert a vector to the list using as.list(x) command. This way you will be able to use x$a notation for your atomic vector. Check this code –

> x <- c(1, 2)
> names(x) <- c("bob", "ed")
> x <- as.list(t(x))
> x$ed
[1] 2

There are number of operators in R which could come in handy for you –

- Minus, can be unary or binary
+ Plus, can be unary or binary
! Unary not
~ Tilde, used for model formulae, can be either unary or binary
? Help
: Sequence, binary (in model formulae: interaction)
* Multiplication, binary
/ Division, binary
^ Exponentiation, binary
%x% Special binary operators, x can be replaced by any valid name
%% Modulus, binary
%/% Integer divide, binary
%*% Matrix product, binary
%o% Outer product, binary
%x% Kronecker product, binary
%in% Matching operator, binary (in model formulae: nesting)
< Less than, binary
> Greater than, binary
== Equal to, binary
>= Greater than or equal to, binary
<= Less than or equal to, binary
& And, binary, vectorized
&& And, binary, not vectorized
| Or, binary, vectorized
|| Or, binary, not vectorized
<- Left assignment, binary
-> Right assignment, binary
$ List subset, binary

    Tweet this to help others

Live Demo

Live demo might not work in Private Window (Incognito)

Sign Up for Our Newsletters

Get only the best articles delivered to your mail

You May Also Like

%% in r language

%% in r language gives the modulus of two numbers. It is basically the remainder of division of first number by second number. Consider this code – Here we are…
View Post