【问题标题】:R assign a list of values to a list of objectsR将值列表分配给对象列表
【发布时间】:2016-01-24 09:41:40
【问题描述】:

感谢您提供帮助。我很高兴在所有 R 轻罪上得到纠正。

我不确定我之前的帖子是否完全清楚,所以我希望澄清一下:

在 R 控制台中,我对 .R 文件的调用“使用源 (etc)” .R 文件中的代码使用变量(例如“提取的信息”)ex1、ex2、ex3。这些可能包含从文本中提取的字符串或(一串)数字。

根据您的指导,我已将我的函数重命名为“重置”(并且 ?reset 表示没有其他事件)在范围内。我从函数外部传递了 x 和 y : #发送变量 ex1, ex2, ex3 连同 location, loc 和 parse, prs 被重置为 0 reset(x

reset<-function(x,y){
print(c("resetting ",x," with ", y))
if (length(x) == length(y)) {x <- y
    print(paste(x,"=",y),sep="") #both x and y should now be equal (to y)
} else {
    paste("list lengths differ: x=",length(x)," y=",length(y),sep="")
}

}

现在 x 和 y 都是 0 但 ex1、ex2 和 ex3 仍然包含以前的值 我希望 ex1、ex2 和 ex3 在用于后续代码部分之前都为 0,因此它们不会用以前的值污染提取的数据,例如:

loc<-str_locate(data[i],"=")
prs<-str_locate(data[i],",")
#extract data from the end of loc to before the occurrence of prs
ex1<-str_sub(data[i],loc[2]+1,prs[1]-1)
#cleanup
#below is simplified for example;
#in reality I wish to send ex1:ex(n) to be reset with values val1:val(n)

期望的结果是回到 Rconsole >ex1 现在应该返回 0。
希望您能理解我的困境并可能有所帮助。


假设我的代码使用一些变量来保存使用 Stringr str_sub 从字符串中提取的数据。这些变量是临时的,因为我使用这些值来构造其他字符串,然后它们应该被释放以用于即将进行的测试:即 if (test==true){extract

对于以后的测试,我想要 extract==0;很简单,但是我有其中的一些,并且想一口气完成。

我用过for循环,但如果有更简单的方法,请指出。

我的尝试是使用一个函数:

#For variables loc, prs, ex1 and x2, set all values to 0
x<-assign(x<-c(loc, prs, ex1, ex2),y<-rep(c(0),length(x)))


#Function
assign <- function(x, y) {
    if(length(x)==length(y)){
        for (i in 1:length(x)){x[i]<-y[i]}
        print(c("Assigned",x[i]))
        return (x)
    } else { print (c("list lengths differ: x=",length(x)," y=",length(y)))
    }
}

问题在于这将 x 返回为 0,但变量列表保留了它们的值。

我对 r 和 SO 都有点小白,所以虽然我在很多场合都从 SO 的丰富建议中受益,但这是我的第一个问题,所以请保持温和。我已经搜索了这个问题,但现在几个小时还没有找到我需要的东西。希望你能帮忙。

【问题讨论】:

  • 已经有一个名为“assign”的函数。您可能会发现它很有用,但无论如何您可能不想更改它。

标签: r object


【解决方案1】:

注意将函数命名为assign。 base-r 中已经有一个,你会造成混乱。

除了名称之外,您的函数还有几个问题。首先,您不需要 for 循环将 x 替换为 y,因为这是基本的矢量化操作。只需使用 x &lt;- y ;其次,您应该将您的消息包装在paste

asgn <- function(x, y) {
  if(length(x)==length(y)){
    ## This step is not needed, return(y) is better as @Rick proposed in their now deleted answer
    ## I am leaving it to show you how the for-loop is not needed
    x<-y
    return (x)
  } else { 
    print (paste("list lengths differ: x=",length(x)," y=",length(y)))
    return(x)
  }
}

然后,您的函数调用存在一些问题。您使用 &lt;- 而不是 = 来指定参数。它们只是分配变量的同义词,但函数参数是另一回事。最后,您尝试使用xy 在参数中的定义(length(x)),但是这是不可能的,因为它还没有定义,所以它在父环境中寻找x。您应该改用 length(3) 测试您的功能。

x<-asgn(x=c(loc, prs, ex1, ex2),y=rep(c(0),length(3)))

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2016-12-06
    • 2012-11-06
    • 2013-02-08
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多