如何一遍又一遍地重复一个表达式,而不必一直复制和粘贴它?

时间:2019-12-19 19:28:08

标签: r

我创建了一个函数,该函数包含函数输入中一系列带有各种对象的减法和加法,我想知道如何执行这些操作,而不必每次添加时都复制并粘贴现有代码一个新对象。

a <- function(qt1,qt2,qt3,qt4,
              cu1,cu2,cu3,cu4,
              gpd1,gpd2,gpd3,gpd4,
              cs1,cs2,cs3,cs4,
              csp1,csp2,csp3,csp4,
              cp1,cp2,cp3,cp4,
              ms1,ms2,ms3,ms4,
              ad1,ad2,ad3,ad4)

{
  c1 = (qt1 * cu1) +gpd1 + cs1 + csp1+ce+cp1
  c2 = (qt2 * cu2) +gpd2 + cs2 + csp2+ce+cp2
  c3 = (qt3 * cu3) +gpd3 + cs3 + csp3+ce+cp3
  c4 = (qt4 * cu4) +gpd4 + cs4 + csp4+ce+cp4

  ct1 = (c1 * 0.4)+c1 + e/4+cap+ ms1+ qt1 *ad1
  ct2 = (c2 * 0.4)+c2 + e/4+cap+ ms2+ qt2 *ad2
  ct3 = (c1 * 0.4)+c3 + e/4+cap+ ms3+ qt3 *ad3
  ct4 = (c1 * 0.4)+c4 + e/4+cap+ ms4+ qt4 *ad4

  print("RU 1")
  print(ct1/qt1)
  print("RU 2")
  print(ct2/qt2)
  print("RU 3")
  print(ct3/qt3)
  print("RU 4")
  print(ct4/qt4)
}

a(qt1=10,qt2=15,qt3=18,qt4=20,
  cu1=5,cu2=2,cu3=12,cu4=17,
  gpd1=2,gpd2=5,gpd3=8,gpd4=8,
  cs1=2,cs2=4,cs3=2,cs4=5,
  csp1=2,csp2=3,csp3=4,csp4=4,
  cp1=2,cp2=2,cp3=2,cp4=2,
  ms1=2,ms2=2,ms3=4,ms4=5,
  ad1=1,ad2=2,ad3=3,ad4=4)

3 个答案:

答案 0 :(得分:5)

这很简单。利用向量而不是将向量作为单独的参数传递。

# qt <- c(qt1, qt2, qt3, qt4)
# cu <- c(cu1, cu2, cu3, cu4)

qt <- c(1, 2, 3, 4)
cu <- c(1, 2, 3, 4)

所有操作在向量上的作用都相同,因此您不必一遍又一遍地显式执行表达式。

# Addition/Subtraction
qt + cu
[1] 2 4 6 8

# Multiplication
qt * cu
[1]  1  4  9 16

# Division
qt / 2
[1] 0.5 1.0 1.5 2.0

答案 1 :(得分:0)

您还可以将参数视为特征。

library(tidyverse)


df_example <- tribble(~cu,~q,~gpd,~cs,~csp,~ce,~cp,~e,~cap,~qt,~ms,~ad,
                      1,2,3,4,5,6,7,8,9,10,11,12,
                      2,4,6,8,10,12,14,16,18,20,22,24)



df_example %>% 
  mutate(c = (qt * cu) +gpd + cs + csp+ce+cp,
         ct = (c * 0.4) + c + e/4+cap+ms+qt+ad,
         result = ct/qt) %>% 
  pull(result)

答案 2 :(得分:0)

在R中,像许多数据科学工具一样,学习使用诸如数据框架之类的集合来跨许多数据点运行所需的分析。因此,为了piggy带技能谋杀者的answer,请考虑使用一个数据帧,该数据帧在R中是一个class对象,该对象扩展了由相等长度的原子向量组成的list类型。

使用这种方法,您可以将范围扩展到仅四个“对象”,而无需更改计算代码或仅打印单个项目。但是,您的数据最初采用宽格式(以后缀名称表示)。但是,如果您将reshape设为长格式,则可以轻松运行公式计算。请参见此demo将输入值迁移为长格式,如下所示。

long_df
#     id qt cu gpd cs csp cp ms ad
# 1 RU 1 10  5   2  2   2  2  2  1
# 2 RU 2 15  2   5  4   3  2  2  2
# 3 RU 3 18 12   8  2   4  2  4  3
# 4 RU 4 20 17   8  5   4  2  5  4

# CALCULATIONS
long_df<- within(long_df, {    
    c <- (qt * cu) + gpd + cs + csp + ce + cp
    ct <- (c * 0.4)+c + e/4+cap+ ms+ qt * ad

    ratio <- ct/qt
})

long_df[c("id", "ratio")]
#     id     ratio
# 1 RU 1  9.685000
# 2 RU 2  6.483333
# 3 RU 3 21.469444
# 4 RU 4 29.562500

使用与e <- 1ce <- 1cap <- 2相同的未知输入来复制打印输出。

# [1] "RU 1"
# [1] 9.685
# [1] "RU 2"
# [1] 6.483333
# [1] "RU 3"
# [1] 17.60278
# [1] "RU 4"
# [1] 23.5425