如何在 R 中创建可在函数和 sql 语句中使用的全局变量?
How do I create a global variable in R which can be used within functions and sql statements?
我想在 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)
正如 James 在评论中提到的,这可能比 get
更可取:
reg <- lm(formula(paste('mpg~', myvar)), data=mtcars)
除非我们从函数内部设置 myvar
,否则我们可以只使用 <-
而不是 <<-
。
在 sqldf
、lm
(或任何函数调用)前面加上 gsubfn package (which is automatically loaded by the sqldf package) allows the use of quasi-perl style string interpolation as shown in Example 5 on the sqldf home page 中的 fn$
。下面我们在前两个示例中使用 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)))
我想在 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)
正如 James 在评论中提到的,这可能比 get
更可取:
reg <- lm(formula(paste('mpg~', myvar)), data=mtcars)
除非我们从函数内部设置 myvar
,否则我们可以只使用 <-
而不是 <<-
。
在 sqldf
、lm
(或任何函数调用)前面加上 gsubfn package (which is automatically loaded by the sqldf package) allows the use of quasi-perl style string interpolation as shown in Example 5 on the sqldf home page 中的 fn$
。下面我们在前两个示例中使用 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)))