当我在原子矢量中使用它时,它可以工作:
x = data.frame(myvar = 1:10)
test_atom = function(var, maxvalue = max(var)) {
return(maxvalue)
}
test_atom(x$myvar)
# [1] 10
但是当我尝试评估数据框中的列时,存在一个问题:
test_df = function(data, var, maxvalue = max(var)) {
params = as.list(match.call()[-1])
data$var = eval(params$var, data)
return(maxvalue)
}
test_df(x, myvar)
# Error in test_df(x, myvar) : object 'myvar' not found
但是请注意,以下工作正常,因此评估似乎很好:
test_df2 = function(data, var, maxvalue = max(var)) {
params = as.list(match.call()[-1])
data$var = eval(params$var, data)
return(data$var)
}
test_df2(x, myvar)
# [1] 1 2 3 4 5 6 7 8 9 10
如何正确评估参数,以便检测x $ myvar的最大值?
编辑为了正确说明我的意图,我希望可以手动设置maxvalue
的值,但如果我将其留空,则应将其自身设置为最大值myvar
。这可以通过函数中的条件语句来实现,以检查参数是否为NULL
,然后将maxvalue
设置为函数内的myvar
的最大值 - 但我想这样做以更简单的方式,即不在函数内。
示例 - 两者都应该可以:
test_df(x, myvar, 5) # I set the value of the last argument manually
test_df(x, myvar) # I leave it blank - and it sets itself to the max value of `myvar`
答案 0 :(得分:1)
您无法使用带有$
子设置的变量,您必须以不同的方式解决它。
test_df3 = function(data, var, maxvalue = max(data[,var])) {
return(maxvalue)
}
您应该传递data
(这是您的数据框)并将其var
值的子集调整为最大值,否则它无法猜测您尝试的是什么获得最大值。
如果var
是列名,它必须是一个字符串,否则R将尝试(在调用时)查找具有此名称的变量/对象,以便为函数赋值。
这给出了:
> test_df3(x,'myvar')
[1] 10
> test_df3(x,'myvar',5)
[1] 5