R 如何精确检查文件路径的非法字符?

R 如何精确检查文件路径的非法字符?,r,filepath,illegal-characters,R,Filepath,Illegal Characters,我正在开发一个闪亮的应用程序,它为每个用户和他们的每个实验生成文件夹和子文件夹 我希望确保用户名和实验名都不包含任何非法字符 我用我知道的每一个非法字符定义一个字符向量,但是,有可能是人为错误。 有没有更精确的方法 dir <- "~/home/my_app_data" usr <- "john" exp <- "explosion`s" path <- paste(dir, usr, exp, sep = &q

我正在开发一个闪亮的应用程序,它为每个用户和他们的每个实验生成文件夹和子文件夹

我希望确保用户名和实验名都不包含任何非法字符

我用我知道的每一个非法字符定义一个字符向量,但是,有可能是人为错误。 有没有更精确的方法

dir <- "~/home/my_app_data"
usr <- "john"
exp <- "explosion`s"
path <- paste(dir, usr, exp, sep = "/")
illegal <- c(" ", ",", "`")

if (any(illegal %in% (strsplit(x = path, split = "") %>% unlist))) {
  stop( "Illegal characters used")
} else {
  dir.create(path, recursive = T)
}

dir使用
grepl
pattern=“\\W”
查找除下划线以外的非单词字符


FUN只允许合法字符可能会更健壮。您肯定会错过一些来自不同语言键盘等的非法字符。您的权利!我考虑过使用[letters,numbers]对象进行此检查,如果没有为此目的制作的R对象/函数!确保存在
grepl(“[^A-z0-9]”,文件名)
将在字符串包含任何非字母数字字符时返回
TRUE
。@DanielO-您不能使用
[A-z]
,ASCII表上的
z
A
之间有六个符号-其中一些符号对于文件路径是非法的。@27➣9您是对的,
grepl(“\\W”,文件名)
可能更合适。非常感谢您的帮助!我的正则表达式不是绝对最强的,你介意详细说明一下(在回答中)为什么这应该主要起作用吗?从ascii到utf-8编码的转换应该处理文件路径中非法的ascii字符-用它们代替utf-8字符。将任何非字母数字的字符替换为“\ux”将处理大量非法字符。我不是100%相信这会清除所有的非法字符——但大多数是。
dir <- "~/home/my_app_data"
usr <- "john"
exp <- "explosion`s"
path <- paste(dir, usr, exp, sep = "/")
if(!(identical(gsub(
  "[^[:alnum:]]+",
  "_",
  iconv(exp, from = "ascii", "utf-8")
), exp))) {
  stop("Illegal characters used")
} else {
  dir.create(path, recursive = TRUE)
}
FUN <- function(x) {
  if (grepl("\\W", x)) stop(sprintf("Illegal characters used in '%s'", x)) else x
}

FUN(usr)
# [1] "john"

FUN(exp)
# Error in FUN(exp) : Illegal characters used in 'explosion`s'

lapply(c(usr, exp), FUN)
# Error in FUN(X[[i]], ...) : Illegal characters used in 'explosion`s' 

FUN("john123")
# [1] "john123"

FUN("john_123")
# [1] "john_123"