在函数调用

时间:2016-01-13 08:30:53

标签: r

当我在原子矢量中使用它时,它可以工作:

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`

1 个答案:

答案 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