r - 如何在 R 中使用增量变量在 for 循环中定义函数?
问题描述
我正在尝试σ_T
使用下面的增量函数编写一个计算总应力的函数。
x
是来自文本文件的输入数据。τ
并且K
是未知值并且dt
是已知常数。
该方程在下一步的方程中使用每一步的输出 , σ_T
。我之前在 MATLAB 中使用for
循环定义了这个函数,但我已经读过 R 不建议这样做。我研究了应用,但我不确定如何用我的增量函数来实现它。
最终目标是在非线性回归分析中使用这个函数。
我在我的问题下方包含了示例数据。它包括一个标题为 的列yT
,它是σ_T
whenK=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
解决方案
lag
不使用您的公式,而只是展示如何使用该函数根据先前的值计算新变量(列) 。在这个简单的例子中,我计算为当前时间戳和前一个时间戳value
的总和。当然,第一个值将是因为在时间 = 0 之前没有值。x
yT
NA
yT
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 循环。
推荐阅读
- bluetooth - 我可以将智能手表 (Galaxy Gear S3) 用作心率监测器吗?
- c# - C# AES 解密返回垃圾数据
- google-apps-script - 基于响应的不同确认消息
- python - 即使 unittest 可以找到它,为什么覆盖运行找不到烧瓶模块?
- python - 关于 python 列表中错误的快速问题 * 一个常量,例如 [a , b, c, d , e ] * x
- python - 我的评论没有显示在 django 博客中
- javascript - 每次全日历重新渲染时都会更改样式
- java - [爪哇| SpringBoot]存储库没有被注入
- mysql - mysql中join errot join时的情况
- java - 有没有办法阻止所有线程同时运行一行代码?