2014-04-06 25 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=", ")