【问题标题】:Passing arguments to functions, and variable scopes in R将参数传递给函数和 R 中的变量范围
【发布时间】:2015-03-24 21:05:54
【问题描述】:

我正在编写一个带有两个参数(状态、结果)的简单函数。状态用于稍后对数据帧进行子集化。

话虽如此,部分要求是状态是长度为 2 的字符向量。我需要编写更多的代码来确保传递的状态符合这个要求。

所以我写了以下内容:

best <- function(state, outcome) {

  outcome <- read.csv("outcome-of-care-measures.csv", colClasses = "character")
  state <- vector(mode = "character", length = 2)
  st.checkTbl <- outcome[8]

  state
  }

但是,当我调用函数并传递参数时:

best("AXA") or best("FOO") or even best("TX") or best(AL)

我得到的只是:“”“”

如果我注释掉#state

如何确保传递给函数的参数在函数中存储为变量(状态)?或者,我是不是想多了?真的,我只是想测试一下我传递给 state 参数的内容是否可以打印出来用于测试目的。

。对不起 101 课。

【问题讨论】:

  • 听起来你想多了。此外,这个函数应该做什么也不是很清楚,因为它将返回一个空字符向量,或者,如果您注释掉该行,则返回您为state 提供的原始值。您可能想给出An Introduction to R manual 的“编写自己的函数”部分。
  • 无论你输入什么状态,你都会在函数内用state &lt;- vector(...)覆盖它
  • 托马斯,我认为你是对的。我想多了,R 只是知道如何处理我的状态论点。我试图弄清楚它如何知道将 state 的值发送到哪里,并向自己证明它实际上正在做我想要它做的事情。
  • @RichardScriven 在考虑了一分钟后我发现了这一点,这就是为什么我得到一个空字符向量的原因。谢谢!
  • 你可以看看你的论点,例如f &lt;- function(x) as.list(match.call()[-1]); f("hello") 可以看到x 输入为“hello”

标签: r function scope default-arguments


【解决方案1】:

您通常会在任何函数之外读取数据,如下所示:

outcome.data <- read.csv("outcome-of-care-measures.csv", colClasses = "character")

否则,由于一个函数有自己的namespace,所以在它内部定义的所有变量都会在它返回时消失,除非它们本身是由带有return(...)的函数返回的。可以通过将多个对象放在一个列表中来返回它们:return(list(item1=var1, item2=var2))

某些函数,例如assign,具有envir 参数,可以将其设置为.GlobalEnv 以更改此行为。更改对象也可以在函数内部使用 &lt;&lt;- 运算符而不是 &lt;- 完成,但通常不建议这样做。

附带说明,使用函数时,需要明确定义:

  1. 它的输入是什么
  2. 它有什么作用
  3. 返回什么

例如,将outcome 用作函数参数然后将csv 文件的内容读入名为income 的变量中是没有用的。那么你的论点就没有用了,因为它会被覆盖。这就是为什么您必须注释掉函数内定义 state 变量的行,才能真正使用函数接收到的 state

这肯定不会回答您的所有问题,但希望它可以帮助您澄清某些事情。对于其余部分,有很多很好的教程可以进一步了解如何在 R 中编程以及如何/何时使用函数。祝你好运,学习愉快!

【讨论】:

  • 虽然有帮助,但我不认为这个建议答案是 OP 的主要问题,即关于变量范围。
  • 你是对的。我为这件事添加了一点解释。希望 OP 发现它很有用,即使作为答案并不完全令人满意。
  • 虽然@DominicComtois 提供了出色的帮助,但我非常感谢。我真的很喜欢 R,并且正在学习喜欢所有这些数据科学的东西!那么你会推荐一个函数来读取我的所有数据,然后将这些变量传递给处理它们的函数吗?
  • @Zach 对于读取数据,通常在函数之外完成。如果您有很多文件要读取,例如,您可以编写一个循环,将所有数据帧(由 read.csv 或 read.table 创建)放在一个列表中。那么是的,使用一个或多个函数可能是进行一些运算的好主意。但是主要工作可以在 GlobalEnv 中(任何函数之外),然后您可能需要编写几个执行特定操作的小函数。决定何时值得编写函数需要实践。它们通常是避免重复的一种方法,但它们不是唯一的方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2015-01-05
  • 2020-10-30
  • 2012-01-21
  • 2015-04-23
  • 2019-10-15
相关资源
最近更新 更多