精簡版
考慮這個函式:
my_fun <- function(x){
deparse(substitute(x))
}
如果只添加了一個變數名,為什么該函式會洗掉`?看這里:
my_fun(`bad name`)
"bad name"
my_fun(`bad name` - 1)
"`bad name` - 1"
長版
我撰寫了一個簡單的函式,它接受一個資料框并使用選定的列進行一些轉換。這是函式:
my_fun <- function(data, transform){
transform <- deparse(substitute(transform))
transform <- unlist(strsplit(transform, "\\ "))
out <- do.call("cbind.data.frame", lapply(transform, function(transform_i){
eval(parse(text= transform_i), data)
}))
names(out) <- transform
return(out)
}
有了這個函式,我們可以做這樣的事情:
# Create data.
df <- data.frame(matrix(rep(1:4, 2), ncol= 2))
names(df) <- c("good_name", "bad name")
# Transform data with function.
my_fun(df, sqrt(good_name) sqrt(`bad name`) - 1)
sqrt(good_name) sqrt(`bad name`) - 1
1 1.000000 0.0000000
2 1.414214 0.4142136
3 1.732051 0.7320508
4 2.000000 1.0000000
但是,如果我們輸入一個包含空格的名稱,則函式會失敗,例如:my_fun(df, `bad name`)。我注意到deparse(substitute(transform))如果我不進行任何轉換,它會洗掉`。看這里:
my_fun <- function(data, transform){
deparse(substitute(transform))
}
my_fun(df, `bad name`)
"bad name"
my_fun(df, `bad name` -1)
"`bad name` - 1"
如何防止deparse(substitute(transform))洗掉`?
我知道有很多方法可以像我的函式一樣轉換資料幀。例如,我們可以在這里使用 with(df, `bad name` -1) 和 with(df, `bad name`)。但這不是問題。
uj5u.com熱心網友回復:
來自幫助檔案?default:反引號選項的默認值不是參考單個符號,而是僅參考復合運算式。這篇 SO 帖子提示查看?Quotes幫助檔案 - 如果需要,我們可以使用反斜杠轉義反引號。
在此示例中,您可以嘗試將deparse函式的反引號引數設定為TRUE。要比較不同的方法以及如何對組合進行決議,請考慮以下情況:
substitute(`bad name`)
#> `bad name`
deparse(substitute(`bad name`))
#> [1] "bad name"
deparse(substitute(`bad name`), backtick = T)
#> [1] "`bad name`"
# and see this fail:
substitute(`bad name)
# and this return
deparse(
deparse(substitute(`bad name`))
)
#> "\"bad name\""
deparse(substitute(
`deparse(substitute(bad name))`
))
#> [1] "deparse(substitute(bad name))"
deparse(substitute(
`deparse(substitute(`bad name`))`
))
#> Error: unexpected symbol in:
#> "deparse(substitute(
#> `deparse(substitute(`bad"
#> > ))
#> Error: unexpected ')' in ")"
# but
deparse(substitute(
`deparse(substitute(\`bad name\`))`
))
#> [1] "deparse(substitute(`bad name`))"
如果目的是強制執行角色名稱,請deparse1查看R4.0.0(2020 年 4 月)及更高版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376157.html
上一篇:在lua中拆分一次函式
下一篇:將“呼叫”物件轉換為R中的函式
