library(IRanges)
.zoom0 <- function(x, z=1)
{
stopifnot(is(x, "Ranges"), is.numeric(z))
if (length(z) > length(x) && length(z) != 1L)
stop("'z' is longer than 'x'")
if (anyNA(z) || min(z) <= -1L)
stop("'z' contains NAs and/or negative values")
new_start <- as.integer(start(x) * z)
new_width <- as.integer(width(x) * z)
BiocGenerics:::replaceSlots(x, start=new_start, width=new_width)
}
.normarg_scale <- function(scale)
{
if (is(scale, "IRanges"))
return(scale)
if (is.numeric(scale))
return(IRanges(1L, scale))
as(scale, "IRanges")
}
## 'oldscale' and 'newscale': integer vectors or IRanges
## objects recycled to the length of 'x'.
rescale <- function(x, newscale=1L, oldscale=1L)
{
if (!is(x, "IRanges"))
x <- as(x, "IRanges")
newscale <- .normarg_scale(newscale)
oldscale <- .normarg_scale(oldscale)
ans <- shift(x, -start(oldscale))
ans <- .zoom0(ans, width(newscale) / width(oldscale))
shift(ans, start(newscale))
}
Then:
> rescale("5-10", newscale=100, oldscale=10)
IRanges object with 1 range and 0 metadata columns:
start end width
<integer> <integer> <integer>
[1] 41 100 60
> rescale("505-510", newscale=100, oldscale="501-510")
IRanges object with 1 range and 0 metadata columns:
start end width
<integer> <integer> <integer>
[1] 41 100 60
> rescale("505-510", newscale="101-200", oldscale="501-510")
IRanges object with 1 range and 0 metadata columns:
start end width
<integer> <integer> <integer>
[1] 141 200 60
There is a rescale() generic in ggbio. Should probably be moved to BiocGenerics and the above rescale() for IRanges turned into a method.
There is also a rescale() S3 generic in the scales package (with arguments x, to, from, ...) but there is nothing we can do about this (the conflicted package will help the end user deal with the name clash).
Then:
There is a
rescale()generic in ggbio. Should probably be moved to BiocGenerics and the aboverescale()for IRanges turned into a method.There is also a
rescale()S3 generic in the scales package (with argumentsx,to,from,...) but there is nothing we can do about this (the conflicted package will help the end user deal with the name clash).