首页 > 解决方案 > 如何在 R 中使用增量变量在 for 循环中定义函数?

问题描述

我正在尝试σ_T使用下面的增量函数编写一个计算总应力的函数。

方程

x是来自文本文件的输入数据。τ并且K是未知值并且dt是已知常数。

该方程在下一步的方程中使用每一步的输出 , σ_T。我之前在 MATLAB 中使用for循环定义了这个函数,但我已经读过 R 不建议这样做。我研究了应用,但我不确定如何用我的增量函数来实现它。

最终目标是在非线性回归分析中使用这个函数。

我在我的问题下方包含了示例数据。它包括一个标题为 的列yT,它是σ_TwhenK=773和的输出τ=4.576

添加:

我尝试使用 for 循环来定义方程,但我认为它不正确。当我将它传递给回归分析时,我得到一个错误。我还从原始图像稍微改变了方程。

yT <- function(x, tau, k){ 
for(i in seq(from=1, to=200, by=1)){
  if (i == 1) {    
    yO = 0 
    dx = 0
  } else {
    yO = yT       
    dx = x[i] - x[i-1] }

  yT = exp(-0.02/tau)*yO + ((k/2) * (1 + exp(-0.02/tau)*dx))
} }

time    x           yT
0.00    0.000E+00   0.00000
0.02    0.000E+00   0.00000
0.04    1.000E-05   0.00771
0.06    1.420E-05   0.01863
0.08    -1.800E-06  0.01716
0.10    3.000E-06   0.01940
0.12    2.080E-05   0.03536
0.14    2.410E-05   0.05379
0.16    8.000E-06   0.05973
0.18    -5.100E-06  0.05554
0.20    7.300E-06   0.06093
0.22    2.750E-05   0.08187
0.24    2.560E-05   0.10126
0.26    6.800E-06   0.10606
0.28    -1.100E-06  0.10475
0.30    1.350E-05   0.11471
0.32    2.670E-05   0.13480
0.34    1.520E-05   0.14594
0.36    -6.000E-06  0.14067
0.38    -5.700E-06  0.13566
0.40    1.200E-05   0.14433
0.42    1.570E-05   0.15581
0.44    3.400E-06   0.15775
0.46    -3.800E-06  0.15413
0.48    7.300E-06   0.15909
0.50    1.970E-05   0.17359
0.52    1.530E-05   0.18464
0.54    7.000E-07   0.18437
0.56    -3.200E-06  0.18110
0.58    1.200E-05   0.18956
0.60    2.220E-05   0.20586
0.62    1.480E-05   0.21638
0.64    2.600E-06   0.21744
0.66    3.900E-06   0.21950
0.68    1.740E-05   0.23196
0.70    2.180E-05   0.24777
0.72    8.800E-06   0.25347
0.74    -4.200E-06  0.24913
0.76    5.600E-06   0.25236
0.78    2.200E-05   0.26823
0.80    2.000E-05   0.28249
0.82    6.000E-06   0.28588
0.84    7.000E-06   0.29004
0.86    1.700E-05   0.30188
0.88    1.800E-05   0.31445
0.90    2.000E-06   0.31462
0.92    -2.000E-06  0.31171
0.94    1.400E-05   0.32115
0.96    2.200E-05   0.33671
0.98    1.200E-05   0.34450
1.00    6.000E-06   0.34763
1.02    1.500E-05   0.35768
1.04    2.200E-05   0.37309
1.06    1.200E-05   0.38072
1.08    0.000E+00   0.37906
1.10    8.000E-06   0.38358
1.12    2.100E-05   0.39810
1.14    1.900E-05   0.41102
1.16    8.000E-06   0.41540
1.18    1.000E-05   0.42130
1.20    2.200E-05   0.43643
1.22    2.000E-05   0.44995
1.24    4.000E-06   0.45108
1.26    1.000E-06   0.44988
1.28    1.800E-05   0.46180
1.30    2.300E-05   0.47753
1.32    1.200E-05   0.48470
1.34    8.000E-06   0.48876
1.36    1.800E-05   0.50051
1.38    2.400E-05   0.51684
1.40    1.200E-05   0.52384
1.42    0.000E+00   0.52156
1.44    1.100E-05   0.52777
1.46    2.600E-05   0.54552
1.48    1.900E-05   0.55780
1.50    8.000E-06   0.56154
1.52    1.300E-05   0.56911
1.54    2.600E-05   0.58669
1.56    2.100E-05   0.60033
1.58    3.000E-06   0.60002
1.60    4.000E-06   0.60049
1.62    2.200E-05   0.61484
1.64    2.500E-05   0.63144
1.66    1.400E-05   0.63949
1.68    9.000E-06   0.64364
1.70    2.200E-05   0.65780
1.72    2.500E-05   0.67422
1.74    1.100E-05   0.67976
1.76    2.000E-06   0.67834
1.78    1.400E-05   0.68618
1.80    2.800E-05   0.70478
1.82    1.900E-05   0.71637
1.84    9.000E-06   0.72018
1.86    1.600E-05   0.72938
1.88    2.800E-05   0.74780
1.90    2.100E-05   0.76074
1.92    3.000E-06   0.75973
1.94    6.000E-06   0.76105
1.96    2.500E-05   0.77701
1.98    2.600E-05   0.79368
2.00    1.300E-05   0.80024
2.02    1.200E-05   0.80601
2.04    2.600E-05   0.82255
2.06    2.800E-05   0.84056
2.08    1.100E-05   0.84538
2.10    2.000E-06   0.84323
2.12    1.800E-05   0.85344
2.14    3.000E-05   0.87286
2.16    2.000E-05   0.88448
2.18    1.000E-05   0.88833
2.20    2.100E-05   0.90066
2.22    3.100E-05   0.92064
2.24    2.000E-05   0.93205
2.26    3.000E-06   0.93030
2.28    1.000E-05   0.93396
2.30    2.700E-05   0.95071
2.32    2.500E-05   0.96585
2.34    1.200E-05   0.97089
2.36    1.500E-05   0.97823
2.38    2.900E-05   0.99633
2.40    2.700E-05   1.01281
2.42    1.000E-05   1.01611
2.44    5.000E-06   1.01553
2.46    2.000E-05   1.02653
2.48    2.900E-05   1.04442
2.50    2.000E-05   1.05529
2.52    1.200E-05   1.05995
2.54    2.400E-05   1.07384
2.56    3.200E-05   1.09384
2.58    1.800E-05   1.10295
2.60    4.000E-06   1.10122
2.62    1.300E-05   1.10645
2.64    2.900E-05   1.12399
2.66    2.400E-05   1.13760
2.68    1.400E-05   1.14344
2.70    1.700E-05   1.15157
2.72    3.000E-05   1.16968
2.74    2.600E-05   1.18464
2.76    7.000E-06   1.18487
2.78    7.000E-06   1.18510
2.80    2.400E-05   1.19845
2.82    2.900E-05   1.21559
2.84    1.700E-05   1.22340
2.86    1.300E-05   1.22809
2.88    2.500E-05   1.24202
2.90    3.200E-05   1.26128
2.92    1.600E-05   1.26812
2.94    5.000E-06   1.26645
2.96    1.600E-05   1.27327
2.98    2.800E-05   1.28931
3.00    2.100E-05   1.29989
3.02    1.500E-05   1.30579
3.04    2.000E-05   1.31552
3.06    2.800E-05   1.33138
3.08    2.200E-05   1.34254
3.10    9.000E-06   1.34363
3.12    1.100E-05   1.34626
3.14    2.400E-05   1.35890
3.16    2.600E-05   1.37303
3.18    1.600E-05   1.37938
3.20    1.400E-05   1.38416
3.22    2.700E-05   1.39895
3.24    2.700E-05   1.41368
3.26    1.200E-05   1.41677
3.28    4.000E-06   1.41367
3.30    1.900E-05   1.42217
3.32    2.900E-05   1.43833
3.34    2.100E-05   1.44826
3.36    1.600E-05   1.45428
3.38    2.200E-05   1.46491
3.40    3.000E-05   1.48166
3.42    1.900E-05   1.48985
3.44    6.000E-06   1.48798
3.46    1.300E-05   1.49152
3.48    2.600E-05   1.50507
3.50    2.400E-05   1.51702
3.52    1.600E-05   1.52275
3.54    1.900E-05   1.53076
3.56    2.900E-05   1.54645
3.58    2.400E-05   1.55822
3.60    1.400E-05   1.56222
3.62    1.800E-05   1.56930
3.64    2.600E-05   1.58251
3.66    1.700E-05   1.58872
3.68    9.000E-06   1.58873
3.70    2.100E-05   1.59800
3.72    2.800E-05   1.61263
3.74    1.700E-05   1.61871
3.76    1.400E-05   1.62245
3.78    2.500E-05   1.63466
3.80    2.700E-05   1.64835
3.82    1.300E-05   1.65119
3.84    1.500E-05   1.65556
3.86    2.600E-05   1.66840
3.88    2.300E-05   1.67886
3.90    1.100E-05   1.68002
3.92    1.700E-05   1.68581
3.94    2.800E-05   1.70005
3.96    2.100E-05   1.70884
3.98    1.100E-05   1.70987
4.00    2.100E-05   1.71861
4.02    2.700E-05   1.73194
4.04    1.700E-05   1.73750
4.06    1.200E-05   1.73918
4.08    2.400E-05   1.75011
4.10    2.700E-05   1.76330
4.12    1.400E-05   1.76641
4.14    1.400E-05   1.76951
4.16    2.700E-05   1.78262
4.18    2.400E-05   1.79335
4.20    1.100E-05   1.79402
4.22    1.900E-05   1.80085
4.24    2.900E-05   1.81536
4.26    2.000E-05   1.82287
4.28    1.100E-05   1.82341
4.30    2.200E-05   1.83243
4.32    2.800E-05   1.84603
4.34    1.700E-05   1.85109
4.36    1.300E-05   1.85305
4.38    2.500E-05   1.86425
4.40    2.700E-05   1.87695
4.42    1.500E-05   1.88033
4.44    1.400E-05   1.88293
4.46    2.600E-05   1.89477
4.48    2.300E-05   1.90425
4.50    1.300E-05   1.90597
4.52    1.800E-05   1.91155
4.54    2.900E-05   1.92558
4.56    2.000E-05   1.93261
4.58    1.200E-05   1.93343
4.60    2.100E-05   1.94120
4.62    2.800E-05   1.95433
4.64    1.700E-05   1.95892
4.66    1.300E-05   1.96041
4.68    2.400E-05   1.97037
4.70    2.700E-05   1.98260
4.72    1.500E-05   1.98553
4.74    1.500E-05   1.98844
4.76    2.700E-05   2.00059
4.78    2.400E-05   2.01038
4.80    1.200E-05   2.01087
4.82    1.800E-05   2.01598
4.84    2.900E-05   2.02956
4.86    2.000E-05   2.03613
4.88    1.200E-05   2.03651
4.90    2.100E-05   2.04383
4.92    2.800E-05   2.05651
4.94    1.700E-05   2.06066
4.96    1.300E-05   2.06170
4.98    2.600E-05   2.07276
5.00    2.500E-05   2.08300
5.02    1.400E-05   2.08472
5.04    1.600E-05   2.08797
5.06    2.800E-05   2.10046
5.08    2.400E-05   2.10981
5.10    1.200E-05   2.10987
5.12    1.900E-05   2.11532
5.14    2.800E-05   2.12769
5.16    2.100E-05   2.13461
5.18    1.300E-05   2.13533
5.20    2.200E-05   2.14299
5.22    2.900E-05   2.15601
5.24    1.800E-05   2.16049
5.26    1.400E-05   2.16187
5.28    2.400E-05   2.17095
5.30    2.700E-05   2.18231
5.32    1.500E-05   2.18437
5.34    1.400E-05   2.18564
5.36    2.700E-05   2.19693
5.38    2.500E-05   2.20663
5.40    1.400E-05   2.20781
5.42    1.900E-05   2.21284
5.44    2.900E-05   2.22556
5.46    2.000E-05   2.23128
5.48    1.300E-05   2.23157
5.50    2.200E-05   2.23881
5.52    2.700E-05   2.24987
5.54    1.700E-05   2.25317
5.56    1.300E-05   2.25338
5.58    2.500E-05   2.26283
5.60    1.800E-05   2.26685
5.62    -1.200E-05  2.24771
5.64    -2.800E-05  2.21631
5.66    -4.000E-06  2.20356
5.68    2.000E-05   2.20937
5.70    1.100E-05   2.20822
5.72    -8.000E-06  2.19242
5.74    -1.200E-05  2.17361
5.76    -1.000E-06  2.16336
5.78    6.000E-06   2.15855
5.80    4.000E-06   2.15222
5.82    2.000E-06   2.14438
5.84    3.000E-06   2.13734
5.86    4.000E-06   2.13111
5.88    3.000E-06   2.12413
5.90    4.000E-06   2.11795
5.92    4.000E-06   2.11180
5.94    3.000E-06   2.10490
5.96    -3.000E-06  2.09341
5.98    -1.300E-05  2.07425
6.00    -1.200E-05  2.05595
6.02    0.000E+00   2.04699
6.04    5.000E-06   2.04192
6.06    3.000E-06   2.03533
6.08    3.000E-06   2.02877
6.10    3.000E-06   2.02223
6.12    2.000E-06   2.01496
6.14    2.000E-06   2.00771
6.16    4.000E-06   2.00204
6.18    4.000E-06   1.99640
6.20    3.000E-06   1.99000
6.22    2.000E-06   1.98287
6.24    -8.000E-06  1.96805
6.26    -1.500E-05  1.94790
6.28    -8.000E-06  1.93323
6.30    5.000E-06   1.92866
6.32    4.000E-06   1.92334
6.34    1.000E-06   1.91572
6.36    2.000E-06   1.90891
6.38    3.000E-06   1.90290
6.40    3.000E-06   1.89691
6.42    2.000E-06   1.89018
6.44    3.000E-06   1.88425
6.46    3.000E-06   1.87835
6.48    3.000E-06   1.87247
6.50    4.000E-06   1.86739
6.52    -1.000E-06  1.85848
6.54    -1.200E-05  1.84112
6.56    -1.300E-05  1.82306
6.58    -2.000E-06  1.81357
6.60    5.000E-06   1.80952
6.62    2.000E-06   1.80317
6.64    1.000E-06   1.79608
6.66    3.000E-06   1.79056
6.68    2.000E-06   1.78429
6.70    2.000E-06   1.77806
6.72    1.000E-06   1.77107
6.74    2.000E-06   1.76489
6.76    4.000E-06   1.76028
6.78    3.000E-06   1.75492
6.80    3.000E-06   1.74958
6.82    2.000E-06   1.74349
6.84    -5.000E-06  1.73203
6.86    -1.400E-05  1.71368
6.88    -1.000E-05  1.69850
6.90    3.000E-06   1.69340
6.92    5.000E-06   1.68987
6.94    1.000E-06   1.68328
6.96    1.000E-06   1.67671
6.98    1.000E-06   1.67017
7.00    2.000E-06   1.66443
7.02    4.000E-06   1.66025
7.04    3.000E-06   1.65533
7.06    2.000E-06   1.64965
7.08    2.000E-06   1.64400
7.10    2.000E-06   1.63837
7.12    2.000E-06   1.63277
7.14    2.000E-06   1.62719
7.16    0.000E+00   1.62010
7.18    -9.000E-06  1.60609
7.20    -1.400E-05  1.58829
7.22    -5.000E-06  1.57751
7.24    5.000E-06   1.57448
7.26    3.000E-06   1.56993
7.28    0.000E+00   1.56308
7.30    2.000E-06   1.55781
7.32    1.000E-06   1.55179
7.34    2.000E-06   1.54656
7.36    2.000E-06   1.54136
7.38    2.000E-06   1.53618
7.40    2.000E-06   1.53103
7.42    2.000E-06   1.52589
7.44    2.000E-06   1.52078
7.46    2.000E-06   1.51569
7.48    2.000E-06   1.51062
7.50    1.000E-06   1.50481
7.52    2.000E-06   1.49979
7.54    -3.000E-06  1.49093
7.56    -1.200E-05  1.47518
7.58    -1.200E-05  1.45949
7.60    1.000E-06   1.45390
7.62    4.000E-06   1.45064
7.64    1.000E-06   1.44509
7.66    1.000E-06   1.43955
7.68    1.000E-06   1.43405
7.70    1.000E-06   1.42857
7.72    1.000E-06   1.42311
7.74    2.000E-06   1.41844
7.76    3.000E-06   1.41457
7.78    3.000E-06   1.41072
7.80    1.000E-06   1.40534
7.82    1.000E-06   1.39998
7.84    2.000E-06   1.39542
7.86    1.000E-06   1.39010
7.88    3.000E-06   1.38636
7.90    2.000E-06   1.38185
7.92    1.000E-06   1.37660
7.94    0.000E+00   1.37059
7.96    -7.000E-06  1.35922
7.98    -1.400E-05  1.34249
8.00    -8.000E-06  1.33047
8.02    3.000E-06   1.32698
8.04    3.000E-06   1.32351
8.06    1.000E-06   1.31851
8.08    1.000E-06   1.31353
8.10    1.000E-06   1.30857
8.12    1.000E-06   1.30364
8.14    2.000E-06   1.29949
8.16    1.000E-06   1.29460
8.18    1.000E-06   1.28972
8.20    2.000E-06   1.28564
8.22    1.000E-06   1.28081
8.24    2.000E-06   1.27676
8.26    1.000E-06   1.27197
8.28    2.000E-06   1.26796
8.30    1.000E-06   1.26321
8.32    1.000E-06   1.25847
8.34    2.000E-06   1.25452
8.36    0.000E+00   1.24905
8.38    2.000E-06   1.24515
8.40    2.000E-06   1.24126
8.42    0.000E+00   1.23585
8.44    -7.000E-06  1.22506
8.46    -1.600E-05  1.20738
8.48    -5.000E-06  1.19825
8.50    4.000E-06   1.19611
8.52    3.000E-06   1.19321
8.54    -1.000E-06  1.18724
8.56    1.000E-06   1.18283
8.58    1.000E-06   1.17844
8.60    1.000E-06   1.17408
8.62    1.000E-06   1.16973
8.64    1.000E-06   1.16540
8.66    2.000E-06   1.16186
8.68    1.000E-06   1.15756
8.70    1.000E-06   1.15329
8.72    0.000E+00   1.14826
8.74    1.000E-06   1.14402
8.76    1.000E-06   1.13980
8.78    2.000E-06   1.13638
8.80    1.000E-06   1.13219
8.82    1.000E-06   1.12803
8.84    1.000E-06   1.12388
8.86    1.000E-06   1.11975
8.88    2.000E-06   1.11641
8.90    1.000E-06   1.11231
8.92    1.000E-06   1.10823
8.94    1.000E-06   1.10417
8.96    1.000E-06   1.10013
8.98    1.000E-06   1.09610
9.00    -5.000E-06  1.08746
9.02    -1.400E-05  1.07192
9.04    -1.000E-05  1.05954
9.06    2.000E-06   1.05646
9.08    4.000E-06   1.05494
9.10    0.000E+00   1.05034
9.12    0.000E+00   1.04575
9.14    1.000E-06   1.04197
9.16    0.000E+00   1.03742
9.18    1.000E-06   1.03367
9.20    1.000E-06   1.02993
9.22    0.000E+00   1.02544
9.24    1.000E-06   1.02174
9.26    1.000E-06   1.01806
9.28    1.000E-06   1.01439
9.30    1.000E-06   1.01074
9.32    2.000E-06   1.00787
9.34    0.000E+00   1.00348
9.36    1.000E-06   0.99987
9.38    2.000E-06   0.99705
9.40    2.000E-06   0.99425
9.42    1.000E-06   0.99068
9.44    1.000E-06   0.98714
9.46    1.000E-06   0.98360
9.48    0.000E+00   0.97931
9.50    0.000E+00   0.97504
9.52    1.000E-06   0.97156
9.54    1.000E-06   0.96810
9.56    0.000E+00   0.96387
9.58    1.000E-06   0.96044
9.60    1.000E-06   0.95702
9.62    1.000E-06   0.95362
9.64    1.000E-06   0.95024
9.66    1.000E-06   0.94686
9.68    1.000E-06   0.94350
9.70    1.000E-06   0.94016
9.72    -4.000E-06  0.93298
9.74    -1.300E-05  0.91888
9.76    -1.100E-05  0.90639
9.78    0.000E+00   0.90244
9.80    3.000E-06   0.90082
9.82    0.000E+00   0.89689
9.84    0.000E+00   0.89298
9.86    0.000E+00   0.88908
9.88    0.000E+00   0.88520
9.90    1.000E-06   0.88212
9.92    1.000E-06   0.87904
9.94    0.000E+00   0.87521
9.96    0.000E+00   0.87139
9.98    2.000E-06   0.86913
10.00   0.000E+00   0.86534

标签: rfunction

解决方案


lag不使用您的公式,而只是展示如何使用该函数根据先前的值计算新变量(列) 。在这个简单的例子中,我计算为当前时间戳和前一个时间戳value的总和。当然,第一个值将是因为在时间 = 0 之前没有值。xyTNAyT

library(dplyr)
library(tibble)

set.seed(123)
data <- tibble(
  time = seq(0, 5, by = 0.02),
  x = runif(-10, 10, n = 251),
  yT = runif(0, 2, n = 251)
)

data2 <- data %>%
  mutate(value = x + lag(yT, 1))

在 base-R 中,解决方案很简单:

data$value  <-  data$x + lag(data$yT)

不需要显式的 for 循环,因为许多 R 函数都是矢量化的:在 C 级别,函数循环遍历矢量元素。C 代码通常比 R 代码快。

我的建议是,如果你可以矢量化:就去做。Apply 和 map 函数可以生成比 for 循环更快的代码,但您确实需要了解 R 中不可变对象的影响才能进行适当的评估。我的观点是 apply 和 map 函数更优雅,并允许更好的可读代码和更安全的循环(您需要担心索引和退出条件)。当您当前的循环依赖于前一个循环的结果时,我认为需要明确的 for 循环。


推荐阅读