为何stringr包中str_sub函数直接传字符串报错,传变量却正常?
为什么
str_sub直接操作字符串字面量会报错? 这个差异的核心原因在于R的赋值逻辑和对象的可绑定性:
当你把字符串赋值给变量后执行
str_sub(x, 2, 2) <- "Kme1"时,这是R的替换函数语法,实际会被解析成:x <- str_sub(x, 2, 2, value = "Kme1")它的本质是:先读取变量
x的当前值,调用str_sub生成修改后的新字符串,再把新字符串重新赋值给变量x。因为x是绑定到当前环境的变量,能够接收新的赋值,所以整个流程可以正常完成。而直接执行
str_sub("TKQTAR", 2, 2) <- "Kme1"时,目标是字符串字面量"TKQTAR"——它是一个临时的、没有绑定到任何变量的常量对象。R的替换赋值需要一个可被重新赋值的目标(即变量)来接收修改后的结果,但字面量无法被绑定或重新赋值,R找不到地方存储新生成的字符串,因此会抛出target of assignment expands to non-language object的错误。
额外补充:R中的字符串本身是不可变对象,不管是变量还是字面量,都不能直接修改内部字符。所有字符串修改操作本质都是创建新的字符串,变量的作用就是接收这个新对象;而字面量没有对应的变量容器,自然无法完成这个流程。
内容的提问来源于stack exchange,提问作者Pavel Shliaha
相关产品推荐
相关产品推荐

