如何在R中创建一个可以在函数和sql语句中使用的全局变量?

时间:2015-02-20 15:58:44

标签: r global-variables

我想在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)

2 个答案:

答案 0 :(得分:6)

您可以使用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)

答案 1 :(得分:1)

除非我们在功能中设置myvar,否则我们可以使用<-代替<<-

来自gsubfn packagesqldf(由sqldf package自动加载)lmfn$(或任何函数调用)的fn$sqldf(或任何函数调用)前缀允许使用如Example 5 on the sqldf home page所示的准perl样式字符串插值。下面我们在前两个例子中使用fn$lmfn$lm。第三个示例中显示的eval(substitute(...))的替代方法是使用lm

以下代码的一个值得注意的特性是代码非常简单。

以下lm代码的第二个重要特征是两个myvar示例的输出显示已经替换了lm 的公式,这在以下情况下很有用你稍后再看它,知道所用的实际价值。也就是说,下面的第一个mpg ~ $myvar示例不会将公式显示为mpg ~ cyl(即使这是我们输入的内容),但在输出中将其显示为lm。同样,最后一个mpg ~ myvar示例不会将公式显示为mpg ~ cyl作为输入,但会在输出中将其显示为lm

如果我们写mtcars而不是quote(mtcars),第一个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)))

或以下代替最后一行:

{{1}}