R - Обнаружение выражений - PullRequest
       9

R - Обнаружение выражений

6 голосов
/ 28 декабря 2011

Какой тип объекта передается в myFunc как x?Это не похоже ни на выражение, ни на функцию, и str просто оценивает его.Я понимаю, что могу использовать force() для оценки.Мне интересно, есть ли какой-нибудь способ собрать больше информации о х, не оценивая ее.

myFunc = function( x )
{
    is.expression( x )    
    is.function( x )
    str( x )
}
myFunc( { x = 5; print( x + 1 ) } )

Ответы [ 3 ]

6 голосов
/ 28 декабря 2011

Вы можете использовать match.call для извлечения аргументов:

myFunc <- function( x ) {
    x <- match.call()$x
    print(class(x))
    print(typeof(x))
    print(mode(x))
    print(storage.mode(x))
    print(is.expression(x))
    print(is.call(x))
    if (is.call(x)) print(x[[1]])
}
myFunc({x = 5; print("a")})
myFunc(expression(x))
x <- factor(1)
myFunc(x)
myFunc(1)

Вероятно, мне нужно сказать, что { - это функция в R, поэтому {...} не более чем call.

Обновлено : почему x не равно function, а { равно function:

f <- function(x) {
    x <- match.call()$x
    print(eval(x[[1]]))
    print(is.function(eval(x[[1]])))
}

f({1})
2 голосов
/ 28 декабря 2011

Я думаю, class справится ... См. Документы .

РЕДАКТИРОВАТЬ: Согласно документы ,

для {, результат последнего оцененного выражения

Это означает, что класс является классом, полученным в результате оценки, поэтому он не отображается как "выражение". Он передается после оценки.

1 голос
/ 28 декабря 2011

Дейсон только что опубликовал аналогичный ответ на этот вопрос на Talkstats.com для определения, является ли объект фреймом данных или списком ( нажмите здесь для ссылки на этот пост) .Я просто расширил его до выражения, которое, я думаю, соответствует вашим потребностям.

j.list <- function(list, by = NULL){
    print("list")
    print(list)
}

j.data.frame <- function(df, ..., by = NULL){
    print("data frame")
    print(df)
}


j.expression <- function(expression, by = NULL){
    print("expression")
    print(expression)
}

j <- function(x, ...){
    UseMethod("j")
}

j(list(test = "this is a list"))
j(data.frame(test = 1:10))
j(expression(1+ 0:9))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...