The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.
readRawHeader()
for TabularTextFile
would produce an obscure “Error in if (!isEmpty) { : argument is of length zero” if the file is empty. Now it detects when the file is empty and gives a more informative error message.dsApplyInPairs()
is defunct. Use future.apply::future_mapply()
instead.extract()
from the R.rsp package.dsApply()
, which has been defunct since version 2.13.0 (April 2019). Use future.apply::future_lapply()
instead.dsApplyInPairs()
is deprecated. Use future.apply::future_mapply()
instead.
dsApply()
is defunct. Use future.apply::future_lapply()
instead.
Removed defunct and hidden argument colClassPatterns
of readDataFrame()
for TabularTextFile
. Use argument colClasses
instead.
Removed defunct and hidden argument files
of extractMatrix()
for GenericTabularFileSet
. Use extractMatrix(ds[files], ...)
instead.
loadToEnv()
for RDataFile
was not declared an S3 method.Package requires R (>= 3.2.0) released April 2015.
Package no longer requires Bioconductor.
dsApply()
is now deprecated. Instead, use future.apply::future_lapply()
.
dsApply()
with .parallel = "BiocParallel::BatchJobs"
and "BatchJobs"
are now defunct. Instead, use future.apply::future_lapply()
with one of the many backends that implements the Future API.
Now getChecksum()
for ChecksumFile
defaults to not creating a checksum file (which is the default for other types of file), but instead always return the checksum of the file by only calculating and in memory. This prevents for instance the equals()
test on two different checksum files to generate another set of checksum files on themselves.
Now findByName()
for GenericDataFileSet
reports on the non-existing root paths in error messages.
GenericDataFile
and GenericDataFileSet
no longer report on memory (RAM) usage of objects.
dsApply(..., .parallel = "future")
now used future_lapply()
of the future package internally. dsApply()
will soon be deprecated (see below).Argument colClassPatterns
of readDataFrame()
for TabularTextFile
is now defunct. Use colClasses
instead.
Argument files
of extractMatrix()
for GenericTabularFileSet
is defunct.
dsApply()
with either .parallel = "BiocParallel::BatchJobs"
or "BatchJobs"
is deprecated. Instead, use future::future_lapply()
with whatever choice of future::plan()
preferred.
Defunct argument aliased
of getDefaultFullName()
for GenericDataFile
and defunct argument alias
of GenericDataFileSet()
have been removed.
Now file sizes are reported using IEC binary prefixes, i.e. bytes, KiB, MiB, GiB, TiB, …, YiB.
Added hasChecksumFile()
for GenericDataFile
.
hasBeenModified()
for GenericDataFile
gained argument update
.
na.omit()
for GenericDataFileSet
; the default one in the stats package works equally well.Arguments$getTags()
failed to drop missing values.
equals(df, other)
for GenericDataFile
would give an error if other
was not a GenericDataFile
.
dropTags()
would drop name if a tag had the same name.
getOneFile()
on a GenericDataFileSet
with a single missing file would give an error, now it gives a file with an NA pathname.
Preparing to make the default pathname for GenericDataFile()
to become NA_character_
. It is currently NULL, but the goal is to enforce length(pathname)
to be one.
extractMatrix(ds, files, ...)
for GenericTabularFileSet
is deprecated. Use extractMatrix(ds[files], ...)
instead.
dsApply(..., .parallel = "future")
, which utilizes the future package.Added support for sortBy(..., by = "mixedroman")
for GenericDataFileSet
.
Now commentChar = ""
and commentChar = FALSE
also disables searching for comment characters (just as commentChar = NULL
) for TabularTextFile
.
readDataFrame()
for TabularTextFile
with column-names translators set, could give an error “Number of read data columns does not match the number of column headers: …”. This was due to an update in utils::read.table()
as of R v3.2.1 svn rev 68831.lapply()
, dsApply()
returns a list with names corresponds to the full names of the data set.getFullNames(..., onRemapping)
to GenericDataFileSet
to warn/err on full-name translations that generates inconsistent fullname-to-index maps before and after.linkTo(..., skip = TRUE)
would give error “No permission to modify existing file: …” also in the case when the proper link already exists and there is no need to create a new one.
Now getReadArguments()
for TabularTextFile
let duplicated named colClasses
entries override earlier ones, e.g. colClasses=c("*" = NA, "*" = "NULL", a = "integer")
is effectively the same as colClasses=c("*" = "NULL", a = "integer")
. Added package test.
nchar(..., type = "chars")
is used internally for all file and directory names (including tags).as.character()
for GenericDataFile
with a missing (NA) pathname on recent R-devel (>= 2015-04-23) related to an update on how nchar()
handles missing values.Now [[
for GenericDataFileSet
returns a GenericDataFile
not only if a numeric index is given but also if a character string is given.
Now argument idx
for getFile()
for GenericDataFileSet
can also be a character string, in which case the file returned is identified using indexOf(..., pattern = idx, by = "exact", onMissing = "error")
.
Added RDataFile
and RDataFileSet
classes for *.RData
files.
requireNamespace()
instead of require()
internally.as.character()
for ChecksumFile
gave an error when the checksum files was missing.Added support for sortBy(..., by = "filesize")
and sortBy(..., decreasing = TRUE)
for GenericDataFileSet
.
Added rep()
for GenericDataFileSet
.
NOTES:
readDataFrame()
would ignore argument colClasses
iff it had no names. Added package system test for this case.commentChar = NULL
for TabularTextFile
:s failed.readChecksums()
for ChecksumFileSet
.byPath()
for GenericDataFileSet
would output verbose message enumerating files loaded to stdout instead of stderr.dsApply()
for GenericDataFileSet
would coerce argument verbose
to logical before applying the function.sep
for readDataFrame()
would only work for ,
and \t
; now it works for any separator.Now indexOf()
first searched by exact names, then as before, i.e. by regular expression and fixed pattern matching. Added package system tests that contains particularly complicated cases for this. This was triggered by a rare but real use case causing an error in aroma.affymetrix. Thanks Benilton Carvalho for reporting on this.
Added argument by
to indexOf()
for GenericDataFileSet
|List.
Added SuggestsNote
field to DESCRIPTION with list of packages that are recommended for the most common use cases.
Bumped package dependencies.
ds[[idx]]
instead of getFile(ds, idx)
where possible.dsApply(..., .parallel = "none")
would lower the verbose threshold before applying the function resulting is less verbose output in the non-parallel case.GenericDataFile
would fail with linkTo()
on Windows systems without necessary privileges. Made the test less conservative. Also, added an Rd section on privileges required on Windows for linkTo()
to work. Thanks to Brian Ripley for reporting on this.NOTES:
readColumns()
for TabularTextFile
handles also header-less files.copyTo()
for GenericDataFileSet
no longer passes ...
to byPath()
when constructing the return data set.renameTo()
passes ...
to R.utils::renameFile()
making it possible to also overwrite existing files.Added is.na()
for GenericDataFile
and GenericDataFileSet
and na.omit()
for the latter, which already supports anyNA()
.
Added linkTo()
for GenericDataFile
, which create a symbolic link at a given destination pathname analogously to how copyTo()
creates a file copy at a given destination pathname.
copyTo()
for GenericDataFile
passes ...
to R.utils::copyFile()
.copyTo()
and renameTo()
for GenericDataFile
had verbose output enabled by default.digest2()
is now defunct.Added duplicated()
, anyDuplicated()
, and unique()
for GenericDataSet
, which all compare GenericDataFile
:s using the equals()
method.
Now c()
for GenericDataFileSet
also works to append GenericDataFile
:s. Added package system test for common use cases of c()
.
Added nbrOfColumns()
for GenericTabularFile
, which, if the number of columns cannot be inferred from the column names, will fall back to read the first row of data and use that as the number of columns.
Now nbrOfColumns()
for ColumnNamesInterface
returns NA if column names cannot be inferred and hence not be counted.
Now readDataFrame(..., header = FALSE)
works as expected for tabular text files without headers.
Now getReadArguments()
for TabularTextFile
returns a colClasses
vector of the correct length also in the case when there are no column names.
loadRDS()
available for plain files and RdsFile
:s.RdsFile
and RdsFileSet
objects for handling *.rds
file sets.GenericSummary
.ChecksumFile
and ChecksumFileSet
.extract()
for GenericDataFileSet
also handles when the data set to be extracted is empty, e.g. extract(GenericDataFileSet(), NA_integer_)
. Also, added support for argument onMissing = "dropall"
, which drops all files if one or more missing files where requested. Added package system tests for these case.GenericDataFileSet$byPath(..., recursive = TRUE)
would be very slow setting up the individual files, especially for large data sets. Now it’s only slow for the first file.Added "[["(x, i)
for GenericDataFileSet
, which gets a GenericDataFile
by index i
in [1,length(x)]
. When i
is non-numeric, the next "[["(x, i)
method in the class hierarchy is used, e.g. the one for Object
:s.
Added gzip()
/gunzip()
for GenericDataFileSet
.
Added anyNA()
to GenericDataFileSet
to test whether any of the pathnames are NA, or not.
getChecksum()
on GenericDataFile
:s and GenericDataFileSet
:s.append()
to become a generic function does now call base::append()
in the default, instead of copy the latter. All this will eventually be removed, when proper support for c
, [
, [[
, etc. has been added everywhere.getChecksum()
from R.cache instead of creating its own. This solves the problem of the default getChecksum()
of R.cache not being found.readDataFrame()
for TabularTextFile
subsets by row, before reparsing numerical columns that were quoted.autoload()
:s used internally.Deprecated digest2()
and deprecated -> defunct -> dropped.
Now GenericDataFileSet()
gives an error informing that argument alias
is defunct.
Now no generic functions are created for defunct methods.
R.filesets
Package
object is also available when the package is only loaded (but not attached).cat()
from R.utils.SPEEDUP: Package no longer uses R.utils::whichVector()
, which use to be 10x faster, but since R 2.11.0 which()
is 3x times again.
Package no longer utilizes import()
, only importFrom()
:s.
WORKAROUND: For now, package attaches the R.oo package. This is needed due to what appears to be a bug in how R.oo finalizes Object
:s assuming R.oo is/can be attached. Until that is resolved, we make sure R.oo is attached.
Forgot to import R.methodsS3::appendVarArgs()
.
[()
and c()
for GenericDataFileSet
.private = FALSE
to byPath()
of GenericDataFileSet
.isGzipped()
ignores the case of the filename extension when testing whether the file is gzipped or not.rm()
calls with NULL assignments.digest2()
, which soon will be deprecated.\usage{}
lines are at most 90 characters long.In addition to a fixed integer, argument skip
for readDataFrame()
(default and for TabularTextFile
) may also specify a regular expression matching the first row of the data section.
Now argument skip
to TabularTextFile
and readDataFrame()
for that class causes the parser to skip that many lines including commented lines, whereas before it did not count commented lines.
Added a default readDataFrame()
for reading data from one or more tabular text files via the TabularTextFile
/TabularTextFileSet
classes.
colClassPatterns
of readDataFrame()
for TabularTextFile
has been renamed to colClasses
.startupMessage()
of R.oo.indexOf()
for GenericDataFileSet
throws an exception if user tries to pass an argument names
.Added head()
and tail()
for GenericTabularFile
.
Added subsetting via [()
to GenericTabularFile
.
nbrOfRows()
for TabularTextFile
forgot to exclude comment rows in the file header.
readColumns()
for GenericTabularFile would not preserve the order of the requested columns
.
Added getOneFile()
for GenericDataFileSet
, which returns the first GenericDataFile
with a non-missing pathname.
Added argument absolute = FALSE
to getPathname()
for GenericDataFile
.
GenericDataFile
stores the absolute pathname of the file, even if a relative pathname is given. This makes sure that the file is found also when the working directory is changed.equals()
for GenericDataFileSet
would only compare the first GenericDataFile
in each set.isGzipped()
to GenericDataFile
.writeColumnsToFiles()
to GenericTabularFile
. Used to be available only for TabularTextFile
.getDefaultColumnNames()
for TabularTextFile
did not use columnNames
if it was set when creating the TabularTextFile
object.
Now getReadArguments()
for TabularTextFile
drops arguments that are NULL, because they could cause errors downstreams, e.g. readDataFrame()
calling read.table(..., colClasses = NULL)
=> rep_len(NULL, x)
=> “Error in rep_len(colClasses, cols) : cannot replicate NULL to a non-zero length”.
as.list()
for GenericDataSet
to return a named list of GenericDataFile
:s (previously it had no names). The names are the (translated) full names of the GenericDataFile
:s.lapply()
and sapply()
for GenericDataSet
, because the corresponding functions in the base package utilizes as.list()
.Now GenericDataFile()
retrieves the file time stamps such that hasBeenModified()
returns a correct value also when first called, and not only TRUE just in case. This has the effect that getChecksum()
will detected cached results already at the second call as long as the file has to been modified. Previously it took two calls to getChecksum()
for it to be properly cached.
Now declaring more internal and temporary Object
fields as “cached”, which means they will be cleared if clearCache()
or gc()
is called on the corresponding object.
Added further verbose output to TabularTextFileSet
.
DOCUMENTATION: Minor corrections to help pages.
NOTES:
TabularTextFile
to ignore header comment arguments when inferring column names and classes.clearCache()
for GenericDataFileSet
relies on ditto of Object
to clear all cached fields (= with field modifier "cached"
).{get,set}Label()
for GenericDataFile
and {get,set}Alias()
for GenericData{File,FileSet}
. Related arguments such at alias
to GenericDataFileSet
and aliased
to getDefaultFullName()
for GenericDataFile
are also deprecated.seq_along(x)
instead of seq(along = x)
everywhere. Similarly, seq(ds)
where ds
is GenericDataFileSet
is now replaced by seq_along(ds)
. Likewise, seq_len(x)
replaces seq(length = x)
, and length(ds)
replaces nbrOfFiles(ds)
.Now TabularTextFile()
tries to infer whether the data section contains column names or not. This is done by comparing to the optional columnNames
header argument. If that is not available, it will (as before) assume there are column names.
Now readDataFrame()
acknowledge header comment arguments columnNames
and columnClasses
if specified in the file.
Now getDefaultColumnNames()
for TabularTextFile
falls back to header comment argument columnNames
, if there are no column names in the actual data table.
Now readRawHeader()
for TabularTextFile
also parses and returns header comment arguments.
ColumnNamesInterface
which GenericTabularFile
now implements. Classes inheriting from GenericTabularFile
should rename any getColumnNames()
method to getDefaultColumnNames()
.whichVector()
with which()
, because the latter is now the fastest again.setColumnNames()
for GenericTabularFile
, which utilizes setColumnNamesTranslator()
.{get,set}ColumnNameTranslator()
in favor of {get,set}ColumnNamesTranslator()
; note the plural form.readDataFrame()
for TabularTextFile
no longer returns attribute fileHeader
, unless argument debug
is TRUE.validate()
to GenericDataFileSet
, which iteratively calls validate()
on all the GenericDataFile
:s in the set. The default is to return NA, indicating that no validation was done.Arguments$getReadablePath()
instead of filePath(..., expandLinks = "any")
.Arguments$getFilename()
below....
to NextMethod()
, cf. R-devel thread ‘Do not pass’…’ to NextMethod() - it’ll do it for you; missing documentation, a bug or just me?’ on Oct 16, 2012.Arguments$getFilename()
from this package to R.utils v1.17.0.fromFiles()
for GenericDataFileSet
is now defunct in place for byName()
, which has been recommended since January
Now readDataFrame()
for TabularTextFile
defaults to read strings as characters rather than as factors. To read strings as factors, just pass argument stringsAsFactors = TRUE
.
Added readDataFrame()
for TabularTextFileSet
.
ROBUSTNESS: Now getHeader()
for TabularTextFile
checks if the file has been modified before returned cached results.
trim()
being overridden by ditto from the IRanges package, iff loaded.extractMatrix()
for GenericTabularFile
adds column names just as ditto for GenericTabularFileSet
does..Internal()
calls.GenericDataFile
and GenericDataFileSet
handle so called “empty” files, which are files with NULL pathnames.getCommentChar()
to TabularTextFile
and argument commentChar
to its constructor. This allows to use custom comment characters other than just "#"
.GenericDataFileSet$byName(..., subdirs)
would throw Error in strsplit(subdirs, split = "/\\")
iff subdirs != NULL
.
Improved the handling of the newly introduced depth
parameter, e.g. by making it optional/backward compatible.
GenericDataFileSet
, such that one can correctly infer fullname and subdirs from the path.named
to getTags()
for FullNameInterface
. If TRUE, tags of format "<name>=<value>"
will be parsed and returned as a named "<value>"
, e.g. "foo,n=23,bar,n=42"
is returned as c("foo", "n"="23", "bar", "n"="42")
.readDataFrame(..., colClasses = ..., trimQuotes = TRUE)
of TabularTextFile
will read numeric columns that are quoted. This is done by first reading them as quoted character strings, dropping the quotes, and then rereading them as numeric values..fileClass
to appendFiles()
for GenericDataFileSet
.ROBUSTNESS: Now appendFiles()
for GenericDataFileSet
asserts that all files to be appended are instances of the file class of this set as given by the static getFileClass()
.
ROBUSTNESS: Added argument .assertSameClass
to appendFiles()
for GenericDataFileSet
, which if TRUE asserts that the files to be appended inherits from the same class as the existing files. Before this test was mandatory.
getChecksum()
to GenericDataFileSet
, which calculates the checksum of the object returned by the protected getChecksumData()
. Use with care, because what objects should be the basis of the checksum is not clear, e.g. should it be only the file system checksum, or should things such as translated fullnames be included as well?equals()
for GenericDataFile
would consider two files not to be equal only if their checksums was equal, and vice verse. Also, when creating the message string explaining why they differ an error would have been thrown.hpaste()
internally wherever applicable.appendFullNameTranslatorBy<what>()
for <character>
and <function>
assert that the translator correctly returns exactly one string. This has the effect that setFullName()
and friends are also tested.Added =
to the list of safe characters for Arguments$getFilename()
.
Added fullname()
, name()
, tags()
, and dropTags()
.
findByName()
for GenericDataFileSet
it would throw “<simpleError in paths[sapply(rootPaths, FUN = isDirectory)]: invalid subscript type ‘list’>” in case no matching root path directories existed.Added dropRootPathTags()
.
GENERALIZATION: Added support to findByName()
for GenericDataFileSet
such that root paths also can be specified by simple regular expression (still via argument paths
). Currently it is only the last subdirectory that can be expanded, e.g. foo/bar/data(,.*)/
.
GENERALIZATION: Now byName()
for GenericDataFileSet
will try all possible data set directories located when trying to setup a data set. Before it only tried the first one located. This new approach is equally fast for the first data set directory as before. The advantage is that it adds further flexibilities, e.g. the first directory may not be what we want but the second, which can be further tested by the byPath()
and downstream methods such as the constructor.
ROBUSTNESS: Now writeColumnsToFiles()
for TabularTextFile
writes files atomically, which should minimize the risk for generating incomplete files.
getTags()
for Arguments
from aroma.core package.fromFiles()
of GenericDataFileSet
has been deprecated, if still called by someone.GENERALIZATION: Now append()
for GenericDataFileSet
tries to also append non-GenericDataFileSet
object by passing them down to appendFiles()
assuming they are GenericDataFile
:s.
GENERALIZATION: Now appendFiles()
for GenericDataFileSet
also accepts a single item. Thus, there is no longer a need to wrap up single items in a list.
ROBUSTNESS: Now GenericDataFileSet$byName()
asserts that arguments name
and tags
contain only valid characters. This will for instance prevent passing paths or pathnames by mistake.
Now appendFullNameTranslator(..., df)
for FullNameInterface
takes either pattern
or fixed
translations in data.frame.
Added sortBy()
to GenericDataFileSet
, which sorts files either in a lexicographic or a mixedsort order.
DOCUMENTATION: Added more Rd help pages.
DOCUMENTATION: Removed any duplicated \usage{}
statements from the Rd documentation.
indexOf()
for GenericDataFileSet
/List would return NA if the search pattern/string contained parentheses. The reason is that such have a special meaning in regular expression. Now indexOf()
first search by regular expression patterns, then by fixed strings. Thanks Johan Staaf at Lund University and Larry(?) for reporting on this issue.Now GenericDataFileSet$findByName(..., mustExist = FALSE)
do no longer throw an exception even if there is no existing root path.
Added argument firstOnly = TRUE
to findByName()
for GenericDataFileSet
.
Added appendFullNameTranslatorBy...()
methods to the FullNameInterface
class for data frames, TabularTextFile
:s, and TabularTextFileSet
:s.
"NA"
to the default na.strings
returned by getReadArguments()
for TabularTextFile
.NOTES:
.onUnknownArgs
to GenericDataFile()
and GenericDataFileSet()
. As before, the default is to throw an exception if there are unknown arguments. However, in certain case it is useful to allow (and ignore) “stray” arguments.indexOf()
of GenericDataFileSet
and GenericDataFileSetList
did not handle names with regular expression symbols +
and *
. Thanks to Randy Gobbel for the initial error report.GenericDataFile
and GenericDataFileSet
.fromFiles()
of GenericDataSet
. Use byPath()
instead.files
is logical, then extract()
of GenericDataFileSet
and GenericDataFileSetList
now asserts that the length of files
matches the number of available files.exData/
.readColumns(..., column=<string>)
on a TabularTextFile
would give “Error … object ‘columnNames’ not found”.default = "\\.([^.]+)$"
to getExtensionPattern()
of GenericDataFile
. Before the default value was hard coded inside this function.setExtensionPattern(..., pattern = NULL)
of GenericDataFile
works.Added protected as.data.frame()
to GenericDataFileSet
List.
Now GenericDataFile(NA, mustExist = FALSE
) is a valid object. Made all methods aware of such missing files.
Now extract(ds, c(1, 2, NA, 4), onMissing = "NA")
returns a valid GenericDataFileSet
where missing files are returned as missing GenericDataFile
:s.
Added na.rm = TRUE
to all getTags()
so that it returns NULL in case the file is missing.
copyTo()
of GenericDataFileSet
quietly ignores missing files.
Added Rd help for indexOf()
of GenericDataFileSet
.
ROBUSTNESS: Using new Arguments$getInstanceOf()
were possible.
Now all index arguments are validated correctly using the new max
argument of Arguments$getIndices()
. Before the case where max == 0
was not handled correctly.
Changed the default to parent = 0
for getDefaultFullName()
of GenericDataFileSet
to be consistent with the documentation.
Now GenericDataFile(pathname)
throws an error if pathname
is referring to a directory.
getPath()
and getDefaultFullName()
of GenericDataFileSet
would return a logical instead of character value.
indexOf(ds, names)
of GenericDataFileSet
would return a logical instead of an integer vector of NA:s if none of the names existed.
translateFullName()
of FullNameInterface
and translateColumnNames()
of GenericTabularFile
throw an exception if some fullnames were translated into NA. They also assert that no names were dropped or added in the process.After doing append()
to a GenericDataFileSet
, the total file size reported would remain the same.
Appending empty data sets using append()
of GenericDataFileSet
would give error ‘Error in this$files[[1]] : subscript out of bounds’.
Added {get,set}ExtensionPattern
() to FullNameInterface
.
Added getExtension()
to GenericDataFile
.
appendFullNameTranslatorBylist()
which makes it possible to do setup a sequence of fullnames translators fnt1
, fnt2
, fnt3
by calling setFullNameTranslator(..., list(fnt1, fnt2, fnt3))
.Added support for having a sequence of fullname translator functions. These can be added using appendFullNameTranslator()
.
Added an example()
to FullNameInterface
.
[()
to TabularTextFile
.Added the FullNameInterface
, which is the interface class that defines what fullnames, names, tags etc are.
Now setFullName*s*Translator()
for GenericDataFileSet
dispatches on the by
argument. If that is not possible, it call setFullNameTranslator()
for each file in the set (as before).
GenericDataFile
and GenericDataFileSet
implements the FullNameInterface
, which mean less redundant code.fromFiles()
to byPath()
. For backward compatibility the former calls the latter.findByName()
of GenericDataFileSet
follows Windows Shortcut links also for subdirectories.Analogously to the method for a GenericDataFile
, the setFullNameTranslator()
method for GenericDataFileSet
now assumes that the fullname translator function accepts also argument set
.
Added argument .fileSetClass
to GenericDataFileSet()
.
GenericDataFile
should accept any number of arguments. The first argument will always be (an unnamed) argument containing the name (or names) to be translated. If the translator is for a GenericDataFile
, an additional argument file
will also be passed. This allows the translator function to for instance read the file header and infer the name that way.Extracted several classes and methods from the aroma.core package.
Created package.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.