You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免deparse(substitute(x))处理含空格变量名时丢失反引号

问题解答

现象原因

这个反引号自动丢失的现象由deparse()函数的默认参数规则导致:
R的deparse()函数提供backtick参数控制非标准变量名的输出格式,默认值为FALSE:

  • 当输入表达式是单个符号时,backtick=FALSE规则下不会给包含空格等特殊字符的非标准名称加反引号,直接输出原始名称文本,因此调用my_fun(bad name)时返回"bad name",丢失外层反引号。
  • 当输入表达式是复合结构(包含运算符、函数调用等)时,deparse()为了保证输出的表达式语法合法,会自动给内部的非标准名称加反引号,不受默认backtick=FALSE的影响,因此调用my_fun(bad name - 1)时会保留反引号。

解决方案

你只需要在调用deparse()时手动指定backtick = TRUE,即可统一两种场景的输出格式,非标准名称都会自动包裹反引号。

修改后的函数代码如下:

my_fun <- function(data, transform){
  # 新增backtick = TRUE参数,保留非标准名称的反引号
  transform <- deparse(substitute(transform), backtick = TRUE)
  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)
}

验证效果

修改后两种调用场景都能正常运行:

  1. 单个非标准变量名调用
my_fun(df, `bad name`)

此时deparse返回"bad name",eval(parse())可以正常识别该列,不会报错。
2. 复合表达式调用

my_fun(df, sqrt(good_name) + sqrt(`bad name`) - 1)

和原有运行效果完全一致,不会产生兼容性问题。

内容的提问来源于stack exchange,提问作者user11538509

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:04