我有一個函式,它接受一個資料框及其列并以各種方式處理它(為簡單起見,省略了)。我們可以將列名作為引數或直接在函式引數中轉換列(如這里)。我需要找出函式中傳遞了哪些物件。
可重現的例子:
df <- data.frame(x= 1:10, y=1:10)
myfun <- function(data, col){
col_new <- eval(substitute(col), data)
# magic part
object_name <- ...
# magic part
plot(col_new, main= object_name)
}
例如,的預期輸出myfun(data= df, x*x)是 plot plot(df$x*df$x, main= "x")。所以標題是x,不是x*x。到目前為止我得到的是:
myfun <- function(data, col){
colname <- tryCatch({eval(substitute(col))}, error= function(e) {geterrmessage()})
colname <- gsub("' not found", "", gsub("object '", "", colname))
plot(eval(substitute(col), data), main= colname)
}
這個函式給出了預期的輸出,但必須有一些更優雅的方法來找出輸入所指的物件。答案必須是基于 R 的。
uj5u.com熱心網友回復:
使用替換獲取作為 col 傳遞的運算式,然后使用 eval 和 all.vars 獲取值和名稱。
myfun <- function(data, col){
s <- substitute(col)
plot(eval(s, data), main = all.vars(s), type = "o", ylab = "")
}
myfun(df, x * x)
另一種可能性是通過一個片面的公式。
myfun2 <- function(formula, data){
plot(eval(formula[[2]], data), main = all.vars(formula), type = "o", ylab = "")
}
myfun2(~ x * x, df)
uj5u.com熱心網友回復:
rlang當您掌握它時,該軟體包可能會非常強大。像這樣的事情做你想要的嗎?
library(rlang)
myfun <- function (data, col){
.col <- enexpr(col)
unname(sapply(call_args(.col), as_string))
}
這會回傳“wt”列。
myfun(mtcars, as.factor(wt))
# [1] "wt"
我不確定您的用例,但這適用于多個輸入。
myfun(mtcars, sum(x, y))
# [1] "x" "y"
最后,您甚至可能不需要這樣做,而是存盤運算式并直接對資料進行操作。tidyeval 框架也可以提供幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358034.html
上一篇:在函式之間傳遞串列
下一篇:C 遞回函式
