2014-04-06 165 views
1

我有以下代碼:與列表評估一個變量

nth <- expression(((1/p)*a0/2)+sum(((1/p)*a*cos(i*pi*x/p)))+sum((1/p)*b*sin(i*pi*x/p))) 
    nth <- as.expression(gsub('pi',pi,nth)) 
    nth <- as.expression(gsub('p',p,nth)) 
    nth <- as.expression(gsub('a0',a0,nth)) 
    nth <- as.expression(gsub('a',a,nth)) 
    nth <- as.expression(gsub('b',b,nth)) 

這導致表達式:

"((1/1) * 1.26424111790395/2) + sum(((1/1) * 0.251688909862584 * cos(i * 3.14159265358979 * x/1))) + sum((1/1) * -1.03501509824516e-16 * sin(i * 3.14159265358979 * x/1))" 

我想接下來要做的就是用一個列表來評價我(如。我= 1:3)沒有評估x。所以我想得到的是這樣的:

"((1/1) * 1.26424111790395/2) + sum(((1/1) * 0.251688909862584 * cos(1 * 3.14159265358979 * x/1)), ((1/1) * 0.251688909862584 * cos(2 * 3.14159265358979 * x/1)), ((1/1) * 0.251688909862584 * cos(3 * 3.14159265358979 * x/1))) + sum(((1/1) * 0.251688909862584 * sin(1 * 3.14159265358979 * x/1)), ((1/1) * 0.251688909862584 * sin(2 * 3.14159265358979 * x/1)), ((1/1) * 0.251688909862584 * sin(3 * 3.14159265358979 * x/1)))" 

我該怎麼做?謝謝。

+0

所以,很明顯,我理解你的問題意味着你想用循環生成一個表達式列表,而不是實際評估任何事情。那是對的嗎? –

+0

是的,類似的東西。我想用匯總表中的值替換匯總操作中的i,同時在相同的彙總操作中保留x的值。我希望這是明確的。 –

+0

太好了。讓我仔細看看它 –

回答

1

爲什麼不試試這個。您會看到我將所需的值封裝在一個循環中,並將所有輸出都放入新的「已完成」數據框中,並在您循環時更新。您可以指定我的有多少,改變的表達,如你所願:

# Define the initial variables that might be changed here 
var_1 <- 3.14159265358979 # This referred to pi in your initial expression 
var_2 <- 1 # This referred to p in your initial expression 
var_3 <- 1.26424111790395 # This refers to a0 in your initial expression 
var_4 <- 0.251688909862584 # This refers to a in your initial expression 
var_5 <- -1.03501509824516e-16 # This refers to b in your initial expression 

n <- 3 # This is the number of equations that will be run through 

# Create an empty dataframe to hold the outputted expressions 
finished = c() # Empty data frame 

# Create an array holding values from 1 to the number of n's that will be run through 
cycle <- c(1:n) 

# Convert cycle to a matrix 
cycle <- as.matrix(cycle) 

# The variable we will be changing is i ... Create the initial loop 
for (i in 1:3) { 
    nth <- expression(((1/p)*a0/2)+sum(((1/p)*a*cos(i*pi*x/p)))+sum((1/p)*b*sin(i*pi*x/p))) # Write the expression to be changed 

    # Substitute in all the relevant values. Note that this is made to be more explicity 
    nth <- as.expression(gsub('pi',var_1,nth)) 
    nth <- as.expression(gsub('p',var_2,nth)) 
    nth <- as.expression(gsub('a0',var_3,nth)) 
    nth <- as.expression(gsub('a',var_4,nth)) 
    nth <- as.expression(gsub('b',var_5,nth)) 

    # I will also, for each value, substitue in relevant value from the cycle array 
    # This will change the i values for you 
    i_index <- cycle[i,1] 
    i_index <- as.character(i_index) 

    nth <- as.expression(gsub('i',i_index,nth)) # Append the nth equation 

    # I will then bind this solution into the finished data frame to hold all solutions 
    finished[i] = nth 
} 

這是一個正在運行的代碼之後生成的輸出:

expression("((1/1) * 1.26424111790395/2) + sum(((1/1) * 0.251688909862584 * cos(1 * 3.14159265358979 * x/1))) + sum((1/1) * -1.03501509824516e-16 * s1n(1 * 3.14159265358979 * x/1))", 
    "((1/1) * 1.26424111790395/2) + sum(((1/1) * 0.251688909862584 * cos(2 * 3.14159265358979 * x/1))) + sum((1/1) * -1.03501509824516e-16 * s2n(2 * 3.14159265358979 * x/1))", 
    "((1/1) * 1.26424111790395/2) + sum(((1/1) * 0.251688909862584 * cos(3 * 3.14159265358979 * x/1))) + sum((1/1) * -1.03501509824516e-16 * s3n(3 * 3.14159265358979 * x/1))") 
+0

我在循環中的變量賦值中的一個小錯誤是,我在所有的i中都替換了值1,2和3。因此,罪已成爲s1n,s2n,s3n。這就是說,這應該是一個簡單的調整,我會留給你! –

0

這應該讓你去。你絕對是在gsub的正確軌道上。
請注意,原始表達式中的j分別被替換爲1,2和3。我去j,因爲gsubi干擾sinpi。希望它有幫助...

> expres <- "(((1/p)*a0/2)+sum(((1/p)*a*cos(j*pi*x/p)))+sum((1/p)*b*sin(j*pi*x/p)))" 
> noquote(sapply(1:3, function(j){ 
     GS <- gsub("j", as.numeric(j), expres) 
     paste0("expression(", GS, ")") 
    })) 
[1] expression((((1/p)*a0/2)+sum(((1/p)*a*cos(1*pi*x/p)))+sum((1/p)*b*sin(1*pi*x/p)))) 
[2] expression((((1/p)*a0/2)+sum(((1/p)*a*cos(2*pi*x/p)))+sum((1/p)*b*sin(2*pi*x/p)))) 
[3] expression((((1/p)*a0/2)+sum(((1/p)*a*cos(3*pi*x/p)))+sum((1/p)*b*sin(3*pi*x/p)))) 
+1

雖然我面臨的挑戰是我不相信櫻桃想要評估方程,因爲x是未知數。因此,你不能在這裏使用eval,因爲不是所有的輸入都是數字的(例如,x沒有被解決)。當然,我完全可以誤讀,但仔細觀察輸出結果,這是我所推斷的。我也在研究解決方案。 –

0

另一種可能的解決方案是使用substitute

g = function(i){ 
    env = list(pi=pi, p=1, a0=1.26424111790395, a=0.251688909862584, b=-1.03501509824516e-16, i=i) 
    as.character(as.expression(substitute(((1/p)*a0/2)+sum(((1/p)*a*cos(i*pi*x/p)))+sum((1/p)*b*sin(i*pi*x/p)), env))) 
} 
paste(lapply(1:3, g), collapse=", ")