R - 检测表达式

时间:2011-12-28 14:59:49

标签: r

将哪种类型的对象作为x传递给myFunc?它似乎不是一个表达式,也不是一个函数而str只是评估它。我知道我可以使用force()进行评估。我想知道是否有一些方法可以在不进行评估的情况下收集有关x的更多信息。

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

3 个答案:

答案 0 :(得分:6)

您可以使用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}) 为{{1}}的原因

{{1}}

答案 1 :(得分:2)

我认为class可以解决问题......请参阅docs

编辑:根据docs

  

表示{,最后一个表达式的结果

这意味着该类是评估产生的类,这就是它不显示为“表达式”的原因。它在评估后通过。

答案 2 :(得分:1)

Dason刚刚在Talkstats.com上发布了类似的回复,用于确定某个对象是数据框还是列表(click here for a link to that post)。我只是将其扩展为我认为符合您需求的表达式。

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))