我想在R中定义一个可以在函数和sqldf语句中使用的全局变量。我的目标是更改我想在代码顶部包含一次的变量 - 并始终使用它。这真的可以节省我的时间,而且我一直无法通过搜索论坛找到解决方案。
# define variable
myvar <<- as.name('cyl')
# use within a sql statement
library("sqldf")
sqldf('
select
avg(myvar)
from
mtcars
')
# use within a regression
reg<-lm(mpg ~ myvar, data=mtcars)
summary(reg)
sprintf
从变量创建查询字符串
myvar <- 'cyl'
query <- sprintf('select avg(%s) from mtcars', myvar)
library("sqldf")
sqldf(query)
get
检索模型设计中的值:
reg <- lm(mpg ~ get(myvar), data=mtcars)
summary(reg)
正如詹姆斯在评论中提到的,这可能比get
更可取:
reg <- lm(formula(paste('mpg~', myvar)), data=mtcars)
除非我们从函数中设置myvar
,否则我们可以只使用 <-
而不是 <<-
.
在 sqldf
前面,lm
(或任何函数调用(使用 gsubfn 包(由 sqldf 包自动加载(中的 fn$
允许使用准 perl 样式的字符串插值,如 sqldf 主页上的示例 5 所示。 下面我们在前两个考点中使用fn$sqldf
和fn$lm
。第三个示例中所示fn$lm
的替代方法是使用 eval(substitute(...))
。
下面代码的一个值得注意的特点是代码都非常简单。
下面lm
代码的第二个重要功能是,两个lm
示例的输出都显示了已替换myvar
公式,这在您稍后查看以了解使用的实际值时非常有用。 也就是说,下面的第一个lm
示例不会将公式显示为mpg ~ $myvar
(即使这是我们输入的内容(,而是将其显示为输出中的mpg ~ cyl
。 同样,最后一个lm
示例不会将公式显示为mpg ~ myvar
输入,而是将其显示为mpg ~ cyl
输出。
如果我们编写mtcars
而不是quote(mtcars)
,第一个lm
示例仍然有效;但是,输出看起来不是很好。 之所以需要这样做,是因为lm
对其参数使用非标准评估。
myvar <- as.name("cyl") # use <<- if done within a function
library(sqldf)
fn$sqldf("select avg($myvar) from mtcars")
fn$lm("mpg ~ $myvar", quote(mtcars))
或以下代替最后一行:
eval(substitute(lm(mpg ~ myvar, data = mtcars), list(myvar = myvar)))