R:调用粘贴的变量名称并将其用作位置参数

时间:2017-09-05 19:09:30

标签: r position paste

我试图将r <= 10的r的所有值替换为x中第一次观察的值(即1)。这只是我想要做的一个非常简单的例子,所以请不要质疑我为什么要以复杂的方式这样做,因为完整的代码更复杂。我唯一需要帮助的是弄清楚如何使用我创建的向量(p1)将r [p1]或等效r [c(1,2,3,4)]替换为x [1](相等)到1)。我不能显式写p1,因为它将在循环中生成(未在代码中显示)。

x=c(1,2,3)
r=c(1,3,7,10,15)
assign(paste0("p", x[1]), which(r<=10))
p1
r[paste0("p", x[1])]=x[1]

在上面的代码中,我尝试使用r[paste0("p", x[1])]=x[1],但这是我最终得到的输出enter image description here

相反,我希望看到这个输出 enter image description here

基本上,我需要找到一种方法在此代码r[??]=x[1]中调用p1而不显式输入p1。

如果需要上下文,我已经包含了我正在尝试的完整代码。

##Creates a function to generate discrete random values from a specified pmf
##n is the number of random values you wish to generate
##x is a vector of discrete values (e.g. c(1,2,3))
##pmf is the associated pmf for the discrete values (e.g. c(.3,.2,.5)) 
r.dscrt.pmf=function(n,x,pmf){
    set.seed(1)
    ##Generate n uniform random values from 0 to 1
    r=runif(n)
    high=0
    low=0
    for (i in 1:length(x)){
        ##High will establish the appropriate upper bound to consider
        high=high+pmf[i]
        if (i==1){
            ##Creates the variable p1 which contains the positions of all
            ##r less than or equal to the first value of pmf
            assign(paste0("p", x[i]), which(r<=pmf[i]))
        } else { 
            ##Creates the variable p2,p3,p4,etc. which contains the positions of all
            ##r between the appropriate interval of high and low
            assign(paste0("p", x[i]), which(r>low & r<=high))
        }
        ##Low will establish the appropriate lower bound to consider
        low=low+pmf[i]
    }
    for (i in 1:length(x)){
        ##Will loops to replace the values of r at the positions specified at 
        ##p1,p2,p3,etc. with x[1],x[2],x[3],etc. respectively.
        r[paste0("p", x[i])]=x[i]
    }
    ##Returns the new r 
    r
}
##Example call of the function
r.dscrt.pmf(10,c(0,1,3),c(.3,.2,.5))

2 个答案:

答案 0 :(得分:3)

getassign类似,因为它允许您通过字符串而不是名称来引用变量。

r[get(paste0("p", x[1]))]=x[1]

get是可以用更清晰,更安全的方式写出来的“旗帜”之一。

答案 1 :(得分:2)

这会满足您的需求吗?

ifelse(r<11, x[1], r)
[1]  1  1  1  1 15