[英]How to remove an element of a vector from within a function in R
是否可以在R函数中更改向量而无需显式返回向量并替换旧的向量? 我有以下功能,可以模拟从卡组中抽出一张卡片,我希望从卡组中取出抽出的卡,但是下面的操作不会改变。
draw_card <- function(deck) {
card <- sample(deck, 1)
remove_card <- sample(which(deck==card))
deck[-remove_card]
card
}
看来危险的<<-
操作员是您的朋友。 但是,它具有环境复杂性,如果甲板位于父环境中,则可以使用,但是如果那里没有甲板,它将在越来越高的环境中寻找,直到找到一个为止。
draw_card <- function(deck) {
card <- sample(deck, 1)
remove_card <- sample(which(deck==card))
deck <<- deck[-remove_card]
card
}
编辑:但是,如果您正在执行这种OOP,我想您应该看一下R6类,可以创建一个甲板对象,然后让draw_card
是一种通过引用更新甲板的方法
例如,这是一个R6类,它可以满足您的需求:
library(R6)
deck <-
R6Class('deck',
public =
list(
cards = list(),
initialize =
function(cards) {
self$cards <- cards
},
drawCard =
function() {
card <- sample(self$cards,1)
self$cards <- setdiff(self$cards,card)
card
}
))
#Make a new object with:
newDeck <- deck$new(1:52)
#Start Drawing Cards
newDeck$drawCard()
newDeck$drawCard()
# Check remaining deck, notice the cards you've drawn are missing:
newDeck$cards
怎么样
## initialise the deck
deck <- 1:52
## remove a random card from the deck
set.seed(123)
deck <- deck[-sample(deck, 1)]
## or, if you're not using 1:52
## deck <- deck[deck != deck[sample(deck, 1)] ]
## record which cards have been removed
removed_card <- 1:52[!1:52 %in% deck]
deck
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
# [40] 41 42 43 44 45 46 47 48 49 50 51 52
removed_card
# [1] 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.