在R中为全局环境分配一个动态函数

在R中为全局环境分配一个动态函数,r,function,global-variables,R,Function,Global Variables,对于本论坛的一些成员来说,这个问题将是一个简单的问题,但我花了很多时间寻找答案,但我没有找到任何有效的答案。 让我澄清一下:我有一个简单的函数,它进行线性回归,结果变成一个变量,这个变量被分配给全局环境。简单的方法 但是,每次我运行这个函数时,变量都会被替换,这是我不想要的。 我只想定义一个特定的名称,而不是替换这个变量 请查看此代码以了解我的问题: set.seed(123) ds <- data.frame(income=rnorm(1000,700,20), sex=c(0,1),

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

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

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

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")
set.seed(123)

ds这是您的代码的一个修改版本,我认为它可以满足您的需要

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")

回归这里是您的代码的一个修改版本,我认为它可以满足您的需求

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")

回归这将
lm
对象写入父帧或由
env
指定的其他环境,打印、打印并以不可见的方式返回。我们还确保公式的环境是
env
,它允许iv_字符串引用
env
中的对象以及
ds
中的列。(如果我们知道
iv_string
只引用
ds
中的列名,那么我们可以使用
fo这将
lm
对象写入父帧或
env
指定的其他环境,打印、打印并以不可见的方式返回它。此外,我们还可以确保公式的环境是
env
允许iv_字符串引用
env
中的对象以及
ds
中的列。(如果我们知道
iv_string
只引用
ds
中的列名,那么我们可以使用
fo,我认为这不是一个好的答案。没有明显的理由OP需要像这样分配给全局环境tn,而不是从函数返回结果并进行分配outside@dww是的,我同意。我不知道我不认为这是一个好答案。没有明显的理由OP需要像这样分配给全局环境TN,而不是从函数返回结果并进行分配outside@dww是的,我同意。您应该
返回函数中的值,并将其分配到函数外部。
谢谢,我编辑了我的问题to澄清。您应该
返回函数中的值,并将其分配到函数外部。
谢谢,我编辑了我的问题以澄清。谢谢,它起作用了!我感谢您提供的附加信息。谢谢,它起作用了!我感谢您提供的附加信息。
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")
Call:
lm(formula = income ~ age, data = ds)  <-- note that formula shows, not just fo

Coefficients:
(Intercept)          age  
   695.1540       0.1699  
regress <- function(iv_string, env = parent.frame()) {
  fo <- as.formula(paste("income ~", iv_string), env)
  results <- do.call("lm", list(fo, quote(ds)))
  plot(results)
  print(results)
  invisible(results)
}

lm_age <- regress("age")