Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-检测表达式_R - Fatal编程技术网

R-检测表达式

R-检测表达式,r,R,将什么类型的对象作为x传递给myFunc?它似乎不是一个表达式,也不是一个函数,str只是计算它。我知道我可以使用force()进行评估。我想知道是否有什么方法可以收集更多关于x的信息而不用评估它 myFunc = function( x ) { is.expression( x ) is.function( x ) str( x ) } myFunc( { x = 5; print( x + 1 ) } ) 我想class会起作用的。。。看 编辑:根据 对于{

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

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

我想
class
会起作用的。。。看

编辑:根据

对于{,计算最后一个表达式的结果


这意味着该类是由求值产生的类,这就是为什么它没有显示为“表达式”。它在求值后被传递。

Dason刚刚发布了一个类似的响应,用于确定对象是数据帧还是列表(.I只是将其扩展为一个我认为适合您需要的表达式

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

j.list您可以使用
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)

类型()和模式()我想您可能会对表达式(基本上是未赋值调用的列表)感到困惑表达式的结果。
x
在你的函数中是6.Hmmm,
class
返回
numeric
,这让我认为它在测试表达式之前实际上会对表达式求值……事实上,即使你试图将表达式赋给一个变量,表达式也会立即运行,最终得到一个数值变量cont完全正确。在赋值或将结果传递给函数之前,立即执行求值。j({x=5;print(x+1)})抛出错误“没有适用于类“c('double','numeric')的对象的'j'的方法”,但解决方案似乎很聪明=)不一定要确定某个对象是数据框还是列表,而是要根据参数是数据框还是列表来定制函数调用,因为海报希望能够为这两种情况提供类似的功能,但希望函数能够告诉传递的对象是列表还是数据框如果{是一个函数,那么为什么.函数(x)返回FALSE?有没有办法改变x的环境?因为x是
调用
,而不是
函数
调用
函数
参数
组成。另请参见更新。
f <- function(x) {
    x <- match.call()$x
    print(eval(x[[1]]))
    print(is.function(eval(x[[1]])))
}

f({1})