The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Analyst Cheat Sheet

Goal

This guide covers the basic workflow:

deal_spec() -> analyze_deal() -> summary() -> deal_cashflows()

The 5 functions to know

The 10 variables that matter most

Variable Meaning
price all-in acquisition price
horizon_years holding period
entry_yield entry cap rate
noi_y1 year-1 NOI if already known
rent_sqm rent per sqm
area_sqm lettable area
vacancy_rate average vacancy
discount_rate discount rate
ltv initial leverage
rate debt interest rate

Use exactly one income mode:

Quick Start

library(cre.dcf)

deal <- deal_spec(
  price = 10e6,
  entry_yield = 0.055,
  horizon_years = 10,
  debt = debt_terms(
    ltv = 0.60,
    rate = 0.045,
    type = "bullet"
  )
)

res <- analyze_deal(deal)

summary(res)
#> # A tibble: 1 × 25
#>   income_mode purchase_year  price horizon_years area_sqm price_per_sqm rent_sqm
#>   <chr>               <dbl>  <dbl>         <int>    <dbl>         <dbl>    <dbl>
#> 1 entry_yield          2026    1e7            10       NA            NA       NA
#> # ℹ 18 more variables: vacancy_rate <dbl>, opex_sqm <dbl>,
#> #   gross_potential_rent_y1 <dbl>, gei_y1 <dbl>, noi_y1 <dbl>, pbtcf_y1 <dbl>,
#> #   entry_yield <dbl>, index_rate <dbl>, discount_rate <dbl>, debt_type <chr>,
#> #   debt_ltv <dbl>, debt_rate <dbl>, irr_project <dbl>, irr_equity <dbl>,
#> #   dscr_min <dbl>, ltv_max_forward <dbl>, ops_share <dbl>, tv_share <dbl>

Typical Workflow

1. Define the deal

deal <- deal_spec(
  price = 12e6,
  rent_sqm = 240,
  area_sqm = 4000,
  vacancy_rate = 0.08,
  opex_sqm = 15,
  horizon_years = 7,
  discount_rate = 0.08,
  debt = debt_terms(
    ltv = 0.55,
    rate = 0.043,
    type = "amort",
    maturity = 7
  )
)

deal
#> <cre_deal_spec>
#> price_di: 12000000.00
#> asset: 4,000.00 sqm | rent 240.00/sqm | vacancy 8.0% | opex 15.00/sqm | price 3,000.00/sqm
#> year-1: GEI 883,200.00 | NOI 823,200.00 | PBTCF 823,200.00 | entry yield 6.86%
#> horizon: 7 years
#> income mode: 4000.00 sqm x 240.00 rent/sqm
#> growth/discount: indexation 2.00% | discount rate 8.00%
#> debt: amort, LTV 55.0%, rate 4.30%

2. Run the deal

res <- analyze_deal(deal)
res
#> <cre_deal_result>
#> # A tibble: 1 × 25
#>   income_mode purchase_year  price horizon_years area_sqm price_per_sqm rent_sqm
#>   <chr>               <dbl>  <dbl>         <int>    <dbl>         <dbl>    <dbl>
#> 1 rent_roll            2026 1.20e7             7     4000          3000      240
#> # ℹ 18 more variables: vacancy_rate <dbl>, opex_sqm <dbl>,
#> #   gross_potential_rent_y1 <dbl>, gei_y1 <dbl>, noi_y1 <dbl>, pbtcf_y1 <dbl>,
#> #   entry_yield <dbl>, index_rate <dbl>, discount_rate <dbl>, debt_type <chr>,
#> #   debt_ltv <dbl>, debt_rate <dbl>, irr_project <dbl>, irr_equity <dbl>,
#> #   dscr_min <dbl>, ltv_max_forward <dbl>, ops_share <dbl>, tv_share <dbl>

3. Read the key metrics

summary(res)
#> # A tibble: 1 × 25
#>   income_mode purchase_year  price horizon_years area_sqm price_per_sqm rent_sqm
#>   <chr>               <dbl>  <dbl>         <int>    <dbl>         <dbl>    <dbl>
#> 1 rent_roll            2026 1.20e7             7     4000          3000      240
#> # ℹ 18 more variables: vacancy_rate <dbl>, opex_sqm <dbl>,
#> #   gross_potential_rent_y1 <dbl>, gei_y1 <dbl>, noi_y1 <dbl>, pbtcf_y1 <dbl>,
#> #   entry_yield <dbl>, index_rate <dbl>, discount_rate <dbl>, debt_type <chr>,
#> #   debt_ltv <dbl>, debt_rate <dbl>, irr_project <dbl>, irr_equity <dbl>,
#> #   dscr_min <dbl>, ltv_max_forward <dbl>, ops_share <dbl>, tv_share <dbl>

Key fields:

4. Extract the tables

deal_cashflows(res, "comparison")
#> # A tibble: 3 × 9
#>   scenario    irr_equity npv_equity irr_project npv_project min_dscr
#>   <chr>            <dbl>      <dbl>       <dbl>       <dbl>    <dbl>
#> 1 all_equity       0.100   1353712.       0.100    1353712.   NA    
#> 2 debt_bullet      0.161   2625108.       0.100    1353712.    3.11 
#> 3 debt_amort       0.130   2165030.       0.100    1353712.    0.794
#> # ℹ 3 more variables: max_ltv_forward <dbl>, ops_share <dbl>, tv_share <dbl>
deal_cashflows(res, "full")
#> # A tibble: 8 × 36
#>    year      gei     noi   pbtcf net_operating_income capex  opex free_cash_flow
#>   <int>    <dbl>   <dbl>   <dbl>                <dbl> <dbl> <dbl>          <dbl>
#> 1     0       0       0       0                    0      0    0      -12000000 
#> 2     1  888000  883200  883200               888000      0 4800         883200 
#> 3     2  905760  900864  900864               905760      0 4896         900864 
#> 4     3  923875. 918881. 918881.              923875.     0 4994.        918881.
#> 5     4  942353. 937259. 937259.              942353.     0 5094.        937259.
#> 6     5  961200. 956004. 956004.              961200.     0 5196.        956004.
#> 7     6  980424. 975124. 975124.              980424.     0 5300.        975124.
#> 8     7 1000032. 994627. 994627.             1000032.     0 5406.      15561702.
#> # ℹ 28 more variables: sale_proceeds <dbl>, discount_factor <dbl>,
#> #   discounted_cash_flow <dbl>, asset_value <dbl>, acquisition_price <dbl>,
#> #   discounted_cf <dbl>, debt_draw <dbl>, interest <dbl>, amortization <dbl>,
#> #   payment <dbl>, arrangement_fee <dbl>, outstanding_debt <dbl>,
#> #   loan_init <dbl>, df <dbl>, cf_pre_debt <dbl>, cf_post_debt <dbl>,
#> #   equity_flow <dbl>, equity_disc <dbl>, noi_fwd <dbl>, value_forward <dbl>,
#> #   dscr <dbl>, interest_cover_ratio <dbl>, debt_yield_init <dbl>, …

Use:

Three Common Input Styles

Entry yield known

deal_spec(price = 10e6, entry_yield = 0.055)
#> <cre_deal_spec>
#> price_di: 10000000.00
#> asset: aggregated inputs (entry_yield)
#> year-1: GEI NA | NOI 550,000.00 | PBTCF 550,000.00 | entry yield 5.50%
#> horizon: 10 years
#> income mode: entry yield 5.50%
#> growth/discount: indexation 2.00% | discount rate 8.00%
#> debt: bullet, LTV 55.0%, rate 4.50%

NOI already known

deal_spec(price = 10e6, noi_y1 = 550000)
#> <cre_deal_spec>
#> price_di: 10000000.00
#> asset: aggregated inputs (noi_y1)
#> year-1: GEI 550,000.00 | NOI 550,000.00 | PBTCF 550,000.00 | entry yield 5.50%
#> horizon: 10 years
#> income mode: NOI_y1 550000.00
#> growth/discount: indexation 2.00% | discount rate 8.00%
#> debt: bullet, LTV 55.0%, rate 4.50%

Rent roll style input

deal_spec(
  price = 10e6,
  rent_sqm = 220,
  area_sqm = 3000,
  vacancy_rate = 0.05,
  opex_sqm = 12
)
#> <cre_deal_spec>
#> price_di: 10000000.00
#> asset: 3,000.00 sqm | rent 220.00/sqm | vacancy 5.0% | opex 12.00/sqm | price 3,333.33/sqm
#> year-1: GEI 627,000.00 | NOI 591,000.00 | PBTCF 591,000.00 | entry yield 5.91%
#> horizon: 10 years
#> income mode: 3000.00 sqm x 220.00 rent/sqm
#> growth/discount: indexation 2.00% | discount rate 8.00%
#> debt: bullet, LTV 55.0%, rate 4.50%

Common Mistakes

When to move to the advanced API

Use the advanced API only if you need:

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.