R-检测表达式
将什么类型的对象作为x传递给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会起作用的。。。看 编辑:根据 对于{
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})