I have run into an error in a script I am writing that only occurs when I have dplyr
running. I first encountered it when I found a function from dplyr
that I wanted to use, after which I installed and ran the package. Here is an example of my error:
First I read in a table from excel that has column values I am going to use as indices in it:
library(readxl)
examplelist <- read_excel("example.xlsx")
The contents of the file are:
1 2 3 4
1 1 4 1
2 3 2 1
4 4 1 4
And then I build a data frame:
testdf = data.frame(1:12, 13:24, 25:36, 37:48)
And then I have a loop that calls a function that uses the values of examplelist
as indices.
testfun <- function(df, a, b, c, d){
value1 <- df[[a]]
value2 <- df[[b]]
value3 <- df[[c]]
value4 <- df[[d]]
}
for (i in 1:nrow(examplelist)){
testfun(testdf, examplelist[i, 1], examplelist[i, 2],
examplelist[i, 3], examplelist[i, 4])
}
When I run this script without dplyr
, everything is fine, but with dplyr
it gives me the error:
Error in .subset2(x, i, exact = exact) : invalid subscript type 'list'
Why would having dplyr
cause this error, and how can I fix it?
I think MKR's answer is a valid solution, I will elaborate a bit more on the why with some alternatives.
The readxl
library is part of the tidyverse
and returns a tibble (tbl_df
) with the function read_excel
. This is a special type of data frame and there are differences from base behaviour, notably printing and subsetting (read here).
Tibbles also clearly delineate
[
and[[
:[
always returns another tibble,[[
always returns a vector. No moredrop = FALSE
So you can see now that your examplelist[i, n]
will return a tibble and not a vector of length 1, which is why using as.numeric
works.
library(readxl)
examplelist <- read_excel("example.xlsx")
class(examplelist[1, 1])
# [1] "tbl_df" "tbl" "data.frame"
class(examplelist[[1, 1]])
# [1] "numeric"
class(as.numeric(examplelist[1, 1]))
# [1] "numeric"
class(as.data.frame(examplelist)[1, 1])
# [1] "numeric"
My workflow tends towards using the tidyverse
so you could use [[
to subset or as.data.frame
if you don't want tibbles.
I can see this issue even without loading dplyr
. It seems the culprit is use of examplelist
items. if you print the value of examplelist[1, 2]
then it is 1x1 dimension data.frame. But the value of a, b, c and d
are expected to be a simple number. Hence if you change examplelist[i, 1]
etc using as.numeric
then the error will be avoided. Change call of testfun
as:
testfun(testdf, as.numeric(examplelist[i, 1]), as.numeric(examplelist[i, 2]),
as.numeric(examplelist[i, 3]), as.numeric(examplelist[i, 4]))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With