【问题标题】:Function to convert from one currency to another currency in R在R中从一种货币转换为另一种货币的函数
【发布时间】:2020-04-23 19:35:16
【问题描述】:

鉴于以下,从 1 美元到

  • 欧元
  • 比索
  • 法郎
  • 澳元
  • 新西兰元
  • 加元

我将如何编写一个函数来从一种货币转换为另一种货币?

函数应该像这样工作 - amount 是数字,fromto 是字符串:

currency(amount = 1, from = 'usd', to = 'euro')
## [1] 8.7

我唯一能想到的 if 就是编写大量 if 语句,但这对于所有这些可能的货币转换/组合来说似乎太乏味了。

我还在考虑在我的函数中创建一个命名向量,如下所示:c('euro' = 0.93, 'peso' = 24.71, 'franc' = 0.98, ...) 等等,以显示从 1 美元到这些货币的兑换率。但仍然不确定如何编写一个函数来解释所有这些货币转换(美元、欧元、比索、法郎、奥地利元、新西兰元、加元)。

【问题讨论】:

  • 好问题,一个有趣的任务 - 我不会立即将命名向量视为一条路线,只是因为我似乎从未使用过它们,但决定走那条路,看看我来了起来! :)
  • 有关如何获取最新货币汇率的信息,请参见此处的主题:stackoverflow.com/questions/26694042/…

标签: r function currency


【解决方案1】:

这是一个函数,它确实存在轻微的舍入误差,但只需要更高分辨率的数字来减少该误差 - 我的值来自谷歌搜索每种货币 10000 美元。如果您想保持值自动更新,您还可以查看从网络上抓取值的包(rvest?)。

currencyCon <- function(x, from = "USD", to = "EUR"){
  # assign values: 1 usd in each currency 
  values <- c(1.000000, 0.927985, 0.810100, 107.624500)
  # names attribute 
  names(values) <- c("USD", "EUR", "GBP", "YEN")
  # calculate (convert from into USD, and divide to)
  values[to] / (values[from] / x)
}

# Testing 
currencyCon(1, "USD", "EUR")
currencyCon(1, "EUR", "EUR")
currencyCon(1, "GBP", "YEN")

返回

 > currencyCon(1, "USD", "EUR")
 EUR 
 0.927985
 > currencyCon(1, "EUR", "EUR")
 EUR 
 1 
 > currencyCon(1, "GBP", "YEN")
 YEN 
 132.8534

【讨论】:

  • 谢谢!将from 的默认值设置为"USD"to 的默认值设置为"EUR" 是否有特定的原因?
  • 另外,在最终输出中你如何只显示数字(不包括货币)?例如,显示这个:0.927985 而不是这个:EUR0.927985
  • 默认选择只是为了它,删除它们使用currencyCon &lt;- function(x, from, to){ ... 并摆脱输出中的名称属性,将计算更改为as.numeric(values[to] / (values[from] * x))。 PS如果这回答了您的问题,请接受答案(如果您觉得慷慨,请点赞)
  • 谢谢!我刚刚接受了答案并投了赞成票(但它说赞成票不会公开显示)。当我调用currencyCon(x=10, from='USD', to='EUR') 时,它会产生0.0927985,而答案实际上是它的100 倍。为什么这个函数只有在x=1 时才能正常工作,并且在x=1 以外的值显示错误的货币转换?
  • 道歉 - 应该是 /x 而不是 *x - 更新答案
【解决方案2】:

以下只是对 rg255 的回答稍作修改。您可以使用 {quantmod} 或其他软件包来确保您的货币兑换率是最新的(请参阅thread)。

library(quantmod)
library(tidyverse)

possible_countries <- c("USD", "EUR", "GBP", "JPY")

rates <- tibble(from = "USD", 
                       to = possible_countries) %>% 
  mutate(getQuote(paste0(from, to, "=X")) %>% 
           select(rate = Last))

currencyCon <- function(x, 
                        from = "USD", 
                        to = "EUR", 
                        lookup = rates){
  # assign values: 1 usd in each currency 
  values <- lookup$rate
  # names attribute 
  names(values) <- lookup$to
  # calculate (convert from into USD, and divide to)
  values[to] / (values[from] / x)
}

crossing(from = possible_countries, 
         to = possible_countries) %>% 
  mutate(start_amount = 10) %>% 
  mutate(amount_converted = currencyCon(start_amount, from, to))
#> # A tibble: 16 x 4
#>    from  to    start_amount amount_converted
#>    <chr> <chr>        <dbl>            <dbl>
#>  1 EUR   EUR             10          10     
#>  2 EUR   GBP             10           8.61  
#>  3 EUR   JPY             10        1328.    
#>  4 EUR   USD             10          12.1   
#>  5 GBP   EUR             10          11.6   
#>  6 GBP   GBP             10          10     
#>  7 GBP   JPY             10        1542.    
#>  8 GBP   USD             10          14.1   
#>  9 JPY   EUR             10           0.0753
#> 10 JPY   GBP             10           0.0649
#> 11 JPY   JPY             10          10     
#> 12 JPY   USD             10           0.0915
#> 13 USD   EUR             10           8.23  
#> 14 USD   GBP             10           7.09  
#> 15 USD   JPY             10        1093.    
#> 16 USD   USD             10          10

reprex package (v2.0.0) 于 2021-05-14 创建

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多