我認爲你不是在尋找is.expression
,而是爲is.name
。
棘手的部分是得到date_col
類型,並檢查它是否是類型的角色,只有當它是name
型不。如果您在名稱中調用is.character
,那麼它將得到評估,通常會導致錯誤,因爲該對象未定義。
要做到這一點,short circuit evaluation可用於:在
if(!(is.name(substitute(date_col)) || is.character(date_col)))
is.character
只調用如果is.name
回報FALSE
。
你的功能可以歸結爲:
data_subset = function(data, date_col) {
if(!(is.name(substitute(date_col)) || is.character(date_col))) {
stop("Input variable date is of wrong format")
}
date_col2 <- as.character(substitute(date_col))
return(data[, date_col2])
}
當然,你可以使用if(is.name(…))
只能轉換爲字符時date_col
是出了名。
這工作:
testDF <- data.frame(col1 = rnorm(10), col2 = rnorm(10, mean = 10), col3 = rnorm(10, mean = 50), rnorm(10, mean = 100))
data_subset(testDF, "col1") # ok
data_subset(testDF, col1) # ok
data_subset(testDF, 1) # Error in data_subset(testDF, 1) : Input variable date is of wrong format
不過,我不認爲你應該這樣做。請看下面的例子:
var <- "col1"
data_subset(testDF, var) # Error in `[.data.frame`(data, , date_col2) : undefined columns selected
col1 <- "col2"
data_subset(testDF, col1) # Gives content of column 1, not column 2.
雖然這個「工作原理設計的」,這是混淆了,因爲除非仔細閱讀你的函數的文檔,人們會期望得到在第一種情況col1
和col2
在第二種情況下。
濫用一個famous quote:
一些人,當遇到一個問題,認爲「我知道,我將使用非標準的評價。」現在他們有兩個問題。
哈德利韋翰在Non-standard evaluation:
非標準評價,您可以編寫非常強大的功能。但是,他們很難理解和編程。除了始終提供逃生艙外,在將其用於新領域之前,請仔細考慮NSE的成本和收益。
除非您希望允許跳過列名稱周圍的引號,否則不要這麼做。
非常感謝您的詳細解答!迄今爲止還沒有聽說過短路評估。 ;) 我將放棄輸入表達式作爲參數的可能性。保存兩個按鍵不值得可能發生的複雜情況,你是對的。 – RomanB