感谢您的帮助。我很高兴能够纠正所有R的不端行为。
我不确定我对我之前的帖子完全清楚如下,所以我希望澄清一下:
在R控制台中,我的调用'使用source(etc)'到.R文件 .R文件中的代码使用变量(例如'提取的信息')ex1,ex2,ex3。这些可能包含从文本中提取的字符串或(一串)数字。
根据您的指导,我已将我的功能重命名为'reset'(并且?reset表示没有其他事件发生)在范围内。我正在传递函数外部的x和y: #send变量ex1,ex2,ex3连同location,loc和parse,prs要重置为0 reset(x&lt; -c(loc,prs,ex1,ex2,ex3),y&lt; -rep(c(0),length(x)))y变量中的#repeats 0与x的条目一样多次< / p>
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&gt; ex1现在应该返回0 希望你能理解我的困境并可能有所帮助。
假设我的代码使用一些变量来保存使用Stringr str_sub从字符串中提取的数据。变量是临时的,因为我使用值来构造其他字符串,然后它们应该被释放以用于即将到来的测试:即if(test == true){extract&lt; -str_sub(string,start,end)} < / p>
对于以后的测试,我想提取== 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的丰富建议,但这是我的第一个问题,所以请保持温和。我已经搜索了这个问题,但现在几个小时内还没找到我需要的东西。希望你能帮忙。
答案 0 :(得分:0)
注意命名函数assign
。在base-r中已经有一个你会产生混乱。
除了名称之外,您的功能还有一些问题。首先,您不需要for-loop将x替换为y,因为这是一个基本的矢量化操作。只需使用x <- 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)
}
}
然后,您的函数调用存在一些问题。您使用<-
而不是=
来指定参数。它们只是分配变量的同义词,但函数参数是另一个问题。最后,您尝试使用x
是参数(y
)中length(x)
的定义,但这是不可能的,因为它尚未定义,因此它正在寻找父环境中的x。您应该使用length(3)
来测试您的功能。
x<-asgn(x=c(loc, prs, ex1, ex2),y=rep(c(0),length(3)))