2016-01-13 122 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