Question: Any quick solution for fixing error : "$ operator is invalid for atomic vectors" ?
gravatar for Jurat Shahidin
21 months ago by
Jurat Shahidin60 wrote:


I have set of genomic interval in GRanges objects. However I intend to filter them conditionally, while export them as bed format files. I have implemented function that possibly accomplish this task, but I have an error. I  have used dplyr packages for facilitating output more efficiently. I simulated same data set as data.frame and it worked perfectly. How can I fix this issue? Any quick solution ?

mini example:

grs <- GRangesList(
  foo = GRanges( seqnames=Rle("chr1", 4),ranges=IRanges(c(3,33,54,91), c(26,42,71,107)),
                  rangeName=c("a1", "a2", "a3", "a4"), score=c(22, 6,13, 7)),
  bar = GRanges(seqnames=Rle("chr1", 6),ranges=IRanges(c(5,12,16,21,37,78), c(9,14,19,29,45,84)),
                 rangeName=c("b1", "b2", "b3", "b4", "b5", "b6"), score=c(3, 5, 3, 9, 4, 3)),
  cat = GRanges(seqnames=Rle("chr1", 7),ranges=IRanges(c(1,8,18,35,42,59,81), c(6,13,27,40,46,63,114)),
                 rangeName=c("c1", "c2", "c3", "c4","c5","c6","c7"), score= c(2.1, 3, 5.1, 3.5, 7, 2, 10))

helper function :

.cast.Pvl<- function(x, pvalueBase = 1L, ...) {
    x$p.value <- 10^(score(x)/(- pvalueBase))
    colnames(mcols(x))[3] <- "p.value"
  } else {

I intend to implement this sketch function :

mylist2 <- lapply(seq_along(grs), function(i) {
  if(is.null(i$p.value)) {
    i <- .cast.Pvl(i, 1L)
  } else {
    splitter <- function(i, tau.w) {
      DF <- grs[[i]]
      DF <- as(DF, "data.frame")
      DF %>%
        filter(p.value >= tau.w) %>%
        write.csv(., sprintf("dropped.%s.csv", i), row.names = FALSE)
      total.ERs <- filter(DF, p.value <= tau.w)
  res <- splitter(i, 1.0E-04)

I have an error like this:

Error in i$p.value : $ operator is invalid for atomic vectors

can't figure out what is possible reason. Can anyone tell me what's going on? How can I fix this bug ? How can I facilitate the output of myList as I expected ? Thanks a lot

ADD COMMENTlink modified 21 months ago by Mike Smith2.8k • written 21 months ago by Jurat Shahidin60
gravatar for Mike Smith
21 months ago by
Mike Smith2.8k
EMBL Heidelberg / de.NBI
Mike Smith2.8k wrote:

I don't full understand what you're trying to achieve, but you're getting this error as a result of the seq_along() function.  If you run this in isolation you'll see it gives you an sequential integer vector of the same length as grs e.g.

> test <- seq_along(grs)
> test
[1] 1 2 3

Your code then applies the function to each element of that vector.  Since each element is a single integer it doesn't have a p.value element and indeed $ isn't valid on vectors e.g.

> test[1]$p.value
Error in test[1]$p.value : $ operator is invalid for atomic vectors

If you want to perform your function on each member of grs you can simply leave out the seq_along() part.  Something like

mylist2 <- lapply( grs, function(i) {
  if(is.null(i$p.value)) {
    i <- .cast.Pvl(i, 1L)


ADD COMMENTlink modified 21 months ago • written 21 months ago by Mike Smith2.8k

Thanks for your respond. The main purpose of I implement above sketch function, given list of genomic interval, first I need to filter them by its p.value, but I let my function only return genomic regions whose p.value less then given threshold, while I need also export dropped features as Bed files (just statistical showed which one dropped). Michael suggest do not use writing my own bed exported. What's the feasible approach ? Any suggestion to make more code more clear and clean ? Thank you

ADD REPLYlink written 21 months ago by Jurat Shahidin60

The rtracklayer package contains the function export() which can take a GRanges object and output a number of different formats including bed files.

ADD REPLYlink written 21 months ago by Mike Smith2.8k
gravatar for Michael Lawrence
21 months ago by
United States
Michael Lawrence10k wrote:

Use the debugging features of R and investigate the type of i. It's probably not what you want. Also, I would recommend against writing your own BED exporter, because it's easy to make mistakes and more generally makes your code more complex. In this case, mistakes include not subtracting 1 from the start values (to make 0-based ranges), and using comma instead of tab as the separator.

ADD COMMENTlink written 21 months ago by Michael Lawrence10k

Thanks for your quick hit. Could you bit more specify your motivation please ? what possible changes is needed ? 

ADD REPLYlink modified 21 months ago • written 21 months ago by Jurat Shahidin60
Please log in to add an answer.


Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.2.0
Traffic: 184 users visited in the last hour