将哪种类型的对象作为x传递给myFunc
?它似乎不是一个表达式,也不是一个函数而str只是评估它。我知道我可以使用force()
进行评估。我想知道是否有一些方法可以在不进行评估的情况下收集有关x的更多信息。
myFunc = function( x )
{
is.expression( x )
is.function( x )
str( x )
}
myFunc( { x = 5; print( x + 1 ) } )
答案 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)
答案 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))