當我使用這個原子序數載體,它的工作原理:函數調用中的評估函數調用
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`
嘗試'test_df(X,X $ MYVAR)'。這個返回'10'。 – symbolrush
@symbolrush當然。但是我希望這個函數接受數據幀作爲第一個參數,然後接受單個變量而不使用'$'函數。這種格式在許多R函數中是習慣的,比如'subset(x,myvar> 5)' – jakub