【发布时间】:2026-02-05 11:10:02
【问题描述】:
我有一些关于在不同函数中以一致的方式用字符串替换表达式中的名称的问题 来自数据框
sample_df <- data.frame(a = 1:5, b = 5:1, c = c(5, 3, 1, 4, 1))
-
在
lm中,我可以使用不同的命令将回归量替换为公式中的字符串lm(a~get("b"),sample_df) # substituting a part of a formula lm(a~eval(as.name("b")),sample_df) # substituting a part of a formula lm(substitute(a~v,list(v=as.name("b"))),sample_df) # substituting the whole formula lm(eval(substitute(a~v,list(v=as.name("b"))),sample_df)) # substituting the whole formula eval(substitute(lm(a~v,sample_df),list(v=as.name("b")))) # substituting the whole call所有这些命令之间有什么区别?我可以看到前两个命令给出了一个分别命名为
get("b")和eval(as.name("b"))的回归量,而其他命令给出了 b。还有其他(可能更微妙/有问题的)差异吗?为什么eval在 3 和 4 之间不相关? -
在
data.table中,所有工作都类似于lmsample_dt=as.data.table(sample_df) sample_dt[,mean:=mean(get("b"))] sample_dt[,eval(substitute(mean:=mean(v),list(v=as.name("b"))))] eval(substitute( sample_dt[,mean:=mean(v)],list(v=as.name("b")))) -
现在,尝试用
dplyr中的字符串替换名称sample_df %>% mutate(mean=mean(get("b"))) eval(substitute(sample_df %>% mutate(mean=mean(v)),list(v=as.name("b"))))第一个在全局环境中寻找一个对象,而第二个工作。我怎么能预测
get在lm和[.data.table中工作时不会在这里工作?
【问题讨论】:
-
为什么不
lm(a~b,sample.df)?这就是帮助页面上的建议。 -
啊哈。当提出最简单的例子时,总是同样的问题。我真的想用一个字符串代替 - 假设我想使用它们的名字循环不同的回归器。
-
所以你要做类似 (for x in c("b","c")) lm(a~as.name(x),data.frame)` 的事情?另外,您想要一个“好”的输出名称用于
predict.lm之类的东西? -
无论我是否直接使用 b 而不是“b”,我都想要完全相同的输出。假设我想将我经常做的事情重写为以数据框和变量名作为参数的函数。
标签: r expression dplyr lm