摘自"统计学习导论",第.3.6.2,我得到以下代码(执行线性回归):
library(MASS)
library(ISLR2)
lm.fit =lm(medv~lstat ,data=Boston )
我的理解是,lm.fit
是线性模型的基本fitter函数.为什么我要用lm()
的结果覆盖它?然后lm.fit
不再是一个函数,而是一个列表.我不应该把lm()
的结果赋给一个新变量吗?
摘自"统计学习导论",第.3.6.2,我得到以下代码(执行线性回归):
library(MASS)
library(ISLR2)
lm.fit =lm(medv~lstat ,data=Boston )
我的理解是,lm.fit
是线性模型的基本fitter函数.为什么我要用lm()
的结果覆盖它?然后lm.fit
不再是一个函数,而是一个列表.我不应该把lm()
的结果赋给一个新变量吗?
正如建议的那样,发布作为答案.
最佳实践not是覆盖已加载包的命名空间中定义的变量,以避免不必要的副作用.在这方面,var1
、lm2
等形式的变量名通常是安全的 Select .哈德利·威克姆(HadleyWickham)的《Style Guide》推荐了var_1
、lm_2
个下划线,但就个人而言,如果你在ESS中使用"智能下划线"(将_
改为<-
),这些下划线可能会有点令人厌烦.
我们可以在分配变量之前进行判断,例如:.
(if (!exists("lm.fit")) lm.fit <- lm(medv ~ lstat, data=ISLR2::Boston))
给出NULL
,表示lm.fit
已经存在.
分配lm.fit
并不是一个主要的攻击,因为lm
仍然像预期的那样工作,正如我们可以看到的那样,函数lm.fit
也一样工作:
lm.fit <- lm(medv ~ lstat, data=ISLR2::Boston)
lm(medv ~ lstat, data=ISLR2::Boston)
### Manually adding an intercept term below to get the same results
lm.fit(x=cbind(rep(1, length(Boston$lstat)), Boston$lstat),
y=Boston$medv)$coefficients
也就是说,当调用lm.fit
时,它仍然是一个函数,就像它在包stats
的命名空间中定义的那样,如下所示:
getAnywhere(lm.fit)
给
2 differing objects matching ‘lm.fit’ were found
in the following places
.GlobalEnv
package:stats
namespace:stats
Use [] to view one of them