【问题标题】:How do I get a function to retain values I assign? (R)如何获得一个函数来保留我分配的值? (右)
【发布时间】:2014-09-10 15:34:49
【问题描述】:

这是我之前发布的关于如何为名称向量赋值的问题的后续:R: How do I concisely assign names to vector parameter components?

我想为名称向量赋值,我需要在下面的代码中以 function2 形式的多个不同函数中执行此操作。与其将代码插入到每个函数中,我想编写一个如下形式的函数 1 的子例程,并在每个函数中调用它。不幸的是,当我调用它时,名称分配保留在 function1 中,并且无法在“return(adam + ...)”部分中使用。我怀疑这与我如何为分配函数指定环境有关,但我不知道如何修复它(我不想全局分配名称)。任何人都可以帮忙吗?

我尝试使用的粗略代码如下:

function1 <- function(vector, names){

for (i in 1:length(vector){

  assign(names[i], vector[,i], envir = environment())
}

}

function2 <- function(vector){

 names1 <- c("adam", "becky", "charlie",...)

 function1(vector,names1)

 return( adam + becky^2 - 2*charlie*david +...)

 }

【问题讨论】:

  • 我会避免使用assign 和全局变量/环境headeach。改用“命名向量”/列表来设置所有变量。
  • 你需要学习函数式编程的概念,尤其是 R。你让这些事情变得比他们需要的要困难得多。
  • +1 罗兰。阅读此内容,基本上是 R 手册 burns-stat.com/pages/Tutor/R_inferno.pdf
  • 谢谢,我会读一读。同时,对这段代码有什么建议吗?

标签: r function environment-variables


【解决方案1】:

您不想为名称分配编写函数,更不用说包含循环的函数了。

改用命名向量。 例如:

vec1 <- c("this","that","the other")
vec2 <- c(5,7,9)
names(vec2) <- vec1

这样就可以了

vec2['that'] <- vec2['that'] + 1
print(vec2)
 this      that the other 
    5         8         9 

【讨论】:

  • 谢谢,但我想要做的不是为条目命名,而是为这些名称赋予值。所以在我上面的例子中,我希望“adam”有值向量[1]。
  • 这是可能的,但除非您出于代码高尔夫或说明性原因而专门这样做,否则在可读性、速度和灵活性方面这是一个较差的实现。主要的问题是它使您无法对所有变量进行任何类型的组操作,而无需按名称单独列出它们,这违背了创建函数的意义;如果您确切地知道要对每个名称做什么(因为您将它们设为常量),则不需要函数。只需列出全局范围内的每个名称并将所需的值放入其中即可。
【解决方案2】:

你可以试试:

function1 <- function(vector, names, envir){
for (i in 1:length(vector)){
 assign(names[i], vector[i], envir = envir)
 }
 }

function2 <- function(vector){
names1 <- c("adam", "becky", "charlie", "david")
function1(vector,names1, envir=environment())
return(adam + becky^2 - 2*charlie*david)
}


v1 <- 1:4
function2(v1)
#[1] -19
adam
#Error: object 'adam' not found

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2020-09-13
    • 2011-12-18
    • 2013-02-25
    • 2021-03-10
    • 2017-06-19
    相关资源
    最近更新 更多