我正在嘗試使用驗證器包來檢查我的資料表中的某些行是否包含正則運算式。
我用要測驗的列創建了一個向量(欄位),然后將驗證器規則的命令作為字串粘貼在一起。
為了能夠在面對()函式中使用規則,我使用 parse() 和 eval() 將字串轉換為運算式
以下示例按預期作業:
library(validate)
data <- data.frame("Protocol_Number" = c("123", "A122"), "Numeric_Result" = c("-0.5", "1.44"))
fields <- c("Protocol_Number", "Numeric_Result")
# build validator commands for each field
cmds <- paste("validator(",
paste(
map_chr(
fields, function(x) paste0("grepl('^-?[0-9]', as.character(`", x, "`))")
), collapse = ","),
")")
# convert to rule and do the tests
rule <- eval(parse(text = cmds))
out <- confront(data, rule)
summary(out)
但是,我想使用一個正則運算式來識別任何型別的數字而不是文本,就像在這個作業示例中一樣
grepl('^-?[0-9]\\d*(\\.\\d )?$', c(1, -1, 0.5, "Not Done"))
當我在上面的例子中嘗試使用這個正則運算式時,parse() 函式會拋出一個錯誤:
Error: '\d' is an unrecognized escape in character string starting "'^-?[0-9]\d"
這不起作用:
# build validator commands for each field
cmds <- paste("validator(",
paste(
map_chr(
fields, function(x) paste0("grepl('^-?[0-9]\\d*(\\.\\d )?$', as.character(`", x, "`))")
), collapse = ","),
")")
# convert to rule and do the tests
rule <- eval(parse(text = cmds))
out <- confront(data, rule)
summary(out)
如何讓 parse() 接受轉義字符?還是有更好的方法來做到這一點?
uj5u.com熱心網友回復:
我們可以用\\
cmds <- paste("validator(",
paste(
map_chr(
fields, function(x)
paste0("grepl('^-?[0-9]\\\\d*(\\\\.\\\\d )?$', as.character(`", x, "`))")
), collapse = ","),
")")
-測驗
> rule <- eval(parse(text = cmds))
>
> out <- confront(data, rule)
> out
Object of class 'validation'
Call:
confront(dat = data, x = rule)
Rules confronted: 2
With fails : 1
With missings: 0
Threw warning: 0
Threw error : 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480982.html
