R语言中如何不使用attach函数生成目标图表
不使用
attach函数生成图表的解决方案 attach() 函数会将数据框的列直接加载到R的全局搜索路径中,很容易出现变量名冲突、后续代码受残留变量影响的问题,确实不推荐日常使用。你可以通过两种方式修改代码实现完全一致的效果,无需调用attach():
方案1:使用绘图/建模函数的data参数
大部分R的基础绘图、建模函数都支持传入data参数指定数据源,公式中用到的变量会自动从对应数据框中读取,是最简洁的写法,修改后的完整代码如下:
library(dplyr) library(lubridate) library(tidyverse) # 数据集df1 df1 <- structure( list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28", "2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"), Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"), DR01 = c(4,1,4,3,3,4,3,6), DR02= c(4,2,6,7,3,2,7,4),DR03= c(9,5,4,3,3,2,1,5), DR04 = c(5,4,3,3,6,2,1,9),DR05 = c(5,4,5,3,6,2,1,9), DR06 = c(2,4,3,3,5,6,7,8),DR07 = c(2,5,4,4,9,4,7,8)), class = "data.frame", row.names = c(NA, -8L)) # 生成图表 dmda<-"2021-07-01" datas<-df1 %>% filter(date2 == ymd(dmda)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) colnames(datas)<-c("Days","Numbers") # 移除attach(datas),绘图时指定data参数 plot(Numbers ~ Days, data = datas, ylim=c(0,20)) # 建模时同样指定data参数 model <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 47,b2 = 0), data = datas) # 取列极值时用$符号显式指定所属数据框 new.data <- data.frame(Days = seq(min(datas$Days),max(datas$Days),len = 45)) lines(new.data$Days,predict(model,newdata = new.data))
方案2:用$符号直接访问列
如果不习惯使用公式的data参数,也可以每次调用变量时都显式指定所属的数据框,示例修改点如下:
- 绘图语句改为:
plot(datas$Numbers ~ datas$Days, ylim=c(0,20)) - 建模语句改为:
model <- nls(datas$Numbers ~ b1*datas$Days^2+b2,start = list(b1 = 47,b2 = 0)) - 极值取值和方案1一致,使用
min(datas$Days)、max(datas$Days)
这种写法更直白,完全不会出现变量来源混淆的问题。
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

