Добавление к одному из ваших подвопросов:
- Какая другая информация необходима для полного описания сущности?
В дополнение кclass
, mode
, typeof
, attributes
, str
и т. Д., Также стоит отметить is()
.
is(1)
[1] "numeric" "vector"
Хотя это полезно, оно также неудовлетворительно.В этом примере 1
- это больше, чем просто;это также атомное, конечное и двойное число.Следующая функция должна показать все, что объект соответствует всем доступным is.(...)
функциям:
what.is <- function(x, show.all=FALSE) {
# set the warn option to -1 to temporarily ignore warnings
op <- options("warn")
options(warn = -1)
on.exit(options(op))
list.fun <- grep(methods(is), pattern = "<-", invert = TRUE, value = TRUE)
result <- data.frame(test=character(), value=character(),
warning=character(), stringsAsFactors = FALSE)
# loop over all "is.(...)" functions and store the results
for(fun in list.fun) {
res <- try(eval(call(fun,x)),silent=TRUE)
if(class(res)=="try-error") {
next() # ignore tests that yield an error
} else if (length(res)>1) {
warn <- "*Applies only to the first element of the provided object"
value <- paste(res,"*",sep="")
} else {
warn <- ""
value <- res
}
result[nrow(result)+1,] <- list(fun, value, warn)
}
# sort the results
result <- result[order(result$value,decreasing = TRUE),]
rownames(result) <- NULL
if(show.all)
return(result)
else
return(result[which(result$value=="TRUE"),])
}
Так что теперь мы получаем более полную картину:
> what.is(1)
test value warning
1 is.atomic TRUE
2 is.double TRUE
3 is.finite TRUE
4 is.numeric TRUE
5 is.vector TRUE
> what.is(CO2)
test value warning
1 is.data.frame TRUE
2 is.list TRUE
3 is.object TRUE
4 is.recursive TRUE
Вы также получаете большеинформация с аргументом show.all=TRUE
.Я не привожу здесь ни одного примера, поскольку результаты имеют длину более 50 строк.
Наконец, это подразумевается как дополнительный источник информации, а не как замена какой-либо другой функции, упомянутой ранее.
РЕДАКТИРОВАТЬ
Чтобы включить еще больше функций "is", согласно комментарию @ Эрдогана, вы можете добавить этот бит в функцию:
# right after
# list.fun <- grep(methods(is), pattern = "<-", invert = TRUE, value = TRUE)
list.fun.2 <- character()
packs <- c('base', 'utils', 'methods') # include more packages if needed
for (pkg in packs) {
library(pkg, character.only = TRUE)
objects <- grep("^is.+\\w$", ls(envir = as.environment(paste('package', pkg, sep = ':'))),
value = TRUE)
objects <- grep("<-", objects, invert = TRUE, value = TRUE)
if (length(objects) > 0)
list.fun.2 <- append(list.fun.2, objects[sapply(objects, function(x) class(eval(parse(text = x))) == "function")])
}
list.fun <- union(list.fun.1, list.fun.2)
# ...and continue with the rest
result <- data.frame(test=character(), value=character(),
warning=character(), stringsAsFactors = FALSE)
# and so on...