在R中为全局环境分配动态功能

时间:2018-06-30 23:03:28

标签: r function global-variables

对于这个论坛的某些成员来说,这个问题将是一个简单问题,但是我花了很多时间来寻找答案,但没有找到任何可行的答案。 让我澄清一下:我有一个进行线性回归的简单函数,结果成为变量,并且将此变量分配给全局环境。简单的方法。

但是,每次我运行此函数时,都会替换变量,这是我不需要的变量。 我只想定义一个特定的名称,而不是替换此变量。

请查看此代码以了解我的问题:

set.seed(123)
ds <- data.frame(income=rnorm(1000,700,20), sex=c(0,1), age=rnorm(1000,30,10))

regress <- function(iv_string) {
  regression_formula <- as.formula(paste("income ~", iv_string))
  results <<- lm(regression_formula, ds)
  plot(results)
  print(results)
}
regress("age")
regress("sex")

类似的东西

  regress <- function(iv_string, **custom_name**) {
      regression_formula <- as.formula(paste("income ~", iv_string))
      results[**custom_name**] <<- lm(regression_formula, ds)
      plot(results)
      print(results)
    }
regress("sex","sex_on_income") #this model will be used in other analysis, once it will be assigned at global environment
regress("age","age_on_income") #this model will be used !!

final solution 非常感谢。

2 个答案:

答案 0 :(得分:2)

这会将lm对象写到env指定的父框架或其他环境中,进行打印,打印并无形地返回。另外,我们确保公式的环境为env,这允许iv_string引用env中的对象以及ds中的列。 (如果我们知道iv_string仅引用了ds中的列名,那么我们可以仅使用fo <- paste("income ~", iv_string),因为lm将接受字符串作为公式。)我们使用{{1 }},以确保do.call(...)输出显示的是实际公式,而不仅仅是lm。我们使用父框架作为fo的默认框架,这种情况更为常见,但是如果您确实希望默认框架为全局环境,请用envparent.frame()替换.GlobalEnv

globalenv()

给予:

regress <- function(iv_string, custom_name = iv_string, env = parent.frame()) {
  fo <- as.formula(paste("income ~", iv_string), env)
  env[[custom_name]] <- results <- do.call("lm", list(fo, quote(ds)))
  plot(results)
  print(results)
  invisible(results)
}

regress("age", "lm_age")

也就是说,R中的常规样式不是将对象写到父框架或全局环境中,而是将它们返回:

Call:
lm(formula = income ~ age, data = ds)  <-- note that formula shows, not just fo

Coefficients:
(Intercept)          age  
   695.1540       0.1699  

答案 1 :(得分:1)

这是您的代码的修改版本,我认为会为您提供所需的内容。

regress <- function(iv_string, custom_name) {
  regression_formula <- as.formula(paste("income ~", iv_string))
  assign(custom_name, lm(regression_formula, ds), envir = .GlobalEnv)
  plot(get(custom_name))
  print(get(custom_name))
}

regress("age", "age_reg")

在上面的代码中,我assign回归到由字符串custom_name定义的全局变量。对于plotprint语句,我使用get获取该字符串中命名的变量并将其传递给那些函数。因此,在我的示例中,它将创建图表并打印结果,并且名为age_reg的变量将出现在全局环境中并包含回归结果。