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



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

相关内容

  • 没有找到相关文章