2016-01-13 80 views
1

当我使用这个原子序数载体,它的工作原理:函数调用中的评估函数调用

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

尝试'test_df(X,X $ MYVAR)'。这个返回'10'。 – symbolrush

+0

@symbolrush当然。但是我希望这个函数接受数据帧作为第一个参数,然后接受单个变量而不使用'$'函数。这种格式在许多R函数中是习惯的,比如'subset(x,myvar> 5)' – jakub

回答

1

不能使用一个变量$ subseting,你必须以不同的方式解决它一点点。

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 
+0

有趣。实际上,我的意图(我将添加到我的问题)是,这将允许用户手动设置值,或者,如果她将参数留空,它将自己设置为最大值myvar。我知道我可以在函数中写一些条件语句来检查参数是否为NULL,如果是,则将其设置为myvar的最大值,但我认为会有一个更简单的方法。 – jakub

+0

@jakub我会等待你对这个问题的更新,添加一些带有预期输出的示例调用,以便清楚你想实现什么。 – Tensibai

+0

好吧,我可以做'test_df5 =函数(data,var,maxvalue = max(data [,deparse(substitute(var))])){return(maxvalue)}'这将允许我使用未加引号的变量名。但它看起来丑陋...没有更好的方法吗? – jakub