我希望我的函式能夠接受一個值或一個列名。如何使用 data.table 執行此操作?
library(data.table)
df <- data.table(a = c(1:5),
b = c(5:1),
c = c(1, 3, 5, 3, 1))
myfunc <- function(val) {
df[a >= val]
}
# This works:
myfunc(2)
# This does not work:
myfunc("c")
如果我將我的函式定義為:
myfunc <- function(val) {
df[a >= get(val)]
}
# This doesn't work:
myfunc(2)
# This works:
myfunc("c")
解決此問題的最佳方法是什么?
編輯:感謝大家的回答,我想我最喜歡 dww 的回答。我希望它像在 dplyr 中一樣簡單,我可以這樣做:
myfunc <- function(val) {
df %>%
filter(a >= {{val}})
}
# Both work:
myfunc(2)
myfunc(c)
uj5u.com熱心網友回復:
如果您構建并決議整個運算式,則可以對其進行整體評估。例如
myfunc <- function(val) {
df[eval(parse(text=paste("a >= ", val)))]
}
盡管依賴于允許您在同一引數中混合值和變數名稱的函式可能是危險的。特別是在您實際上想要匹配字符值而不是變數名稱的情況下。如果你傳入整個運算式,你可以做
myfunc <- function(expr) {
expr <- substitute(expr)
df[eval(expr)]
}
myfunc(a>=3)
myfunc(a>=c)
uj5u.com熱心網友回復:
該問題實際上并未定義所需的行為,因此我們假設 df 必須是 data.table 并且如果傳遞了字串,則應回傳該名稱的列,如果傳遞的是數字,則那些a列超過該數字的行應該被退回。
為字符和默認定義 S3 泛型和方法。
myfunc <- function(x, data = df) UseMethod("myfunc")
myfunc.character <- function(x, data = df) data[[x]]
myfunc.default <- function(x, data = df) data[a > x]
myfunc(2)
## a b c
## 1: 3 3 5
## 2: 4 2 3
## 3: 5 1 1
myfunc("c")
## [1] 1 3 5 3 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/341306.html
