这似乎是一个基本的问题,但我找不到一个解释.

我可以这样命名一个向量:

values = c("lab1" = "my_lab1", 
           "lab2" = "my_lab2")
values
#      lab1      lab2 
# "my_lab1" "my_lab2" 

我可以使用paste0创建一个元素来创建相同的向量,如下所示:

values = c("lab1" = "my_lab1", 
           "lab2" = paste0("my_lab", "2"))
values
#      lab1      lab2 
# "my_lab1" "my_lab2"

但是,当您try 创建带有paste0的名称时,会导致错误:

values = c("lab1" = "my_lab1", 
           paste0("lab", "2") = "my_lab2")
# Error: unexpected '=' in:
# "values = c("lab1" = "my_lab1", 
#            paste0("lab", "2") ="

Why is this?考虑到以下情况属实:

identical("lab2", paste0("lab", "2"))
[1] TRUE

一个解决方案是使用setNames,但我感兴趣的是为什么上面的是一个问题:

setNames(c("my_lab1", "my_lab2"), c("lab1", paste0("lab", "2")))
#      lab1      lab2 
# "my_lab1" "my_lab2"

我在Advanced Rvector部分没有看到任何提到这一点的地方.

谢谢

推荐答案

问题是命名参数根本不会求值.它们被假定为字面值.考虑一下……的情况

foo <- function(a=5, x=10) {a+x}

然后你就这么做了

x <- "a"
foo(x = 2)
foo(paste(x) = 2) # error

如果您期望计算"x",它可能会使实际应该运行的东西变得非常混乱.R解析器不希望将表达式视为参数名称.语法是defined in the R source code,在R Language Definition中也提到了这一事实,它说

每个参数都可以加标签(tag=expr),或者只是一个简单的表达式.它也可以是空的,也可以是特殊令牌之一...、..2等.标签可以是标识符,也可以是文本字符串.

这确实意味着标签本身不能是一个表达式.

在本例中,我使用foo作为函数,但c也只是一个函数.虽然它没有显式的命名参数,但它遵循有关参数名称的其他函数的所有相同规则.

在tidyVerse/rlang世界中,他们定义了一个新函数:=,允许您使用参数名称

rlang::list2("lab1" = "my_lab1", 
               !!paste0("lab", "2") := "my_lab2")
# $lab1
# [1] "my_lab1"
# $lab2
# [1] "my_lab2"

但要做到这一点,使用=是不可能的,他们必须使用:=,这是R中的一个函数,而不是特殊字符,他们在执行时手动重写调用.

R相关问答推荐

如果行和列名以相同的开头,将矩阵值设置为0

使用对管道内单元格的引用生成新变量

查找图下的面积

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

IMF IFS数据以R表示

从BRM预测价值

将小数分隔符放在R中的前两位数字之后

R—将各种CSV数字列转换为日期

如何使用ggplot对堆叠条形图进行嵌套排序?

从外部文件读取多个值作为字符向量

根据类别合并(汇总)某些行

如何删除仅在数据集顶部和底部包含零的行

`夹心::vcovCL`不等于`AER::tobit`标准错误

QY数据的处理:如何定义QY因素的水平

扩展R中包含列表的数据框

如何将一些单元格的内容随机 Select 到一个数据框中?

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

如何在内联代码中添加额外的空格(R Markdown)

如何在一种 colored颜色 中设置数值变量的 colored颜色 和高于阈值的 colored颜色 点?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?